2016-10-11 1 views
0

나는 0에서 1 사이의 1,000,000 개의 난수를 생성하고 가장 큰 수를 찾아서 인쇄하는 프로그램을 찾으려고합니다.ArrayList Java에서 무작위로 가장 큰 double을 찾는데 오류가 발생했습니다. Java

제너레이터를 사용하여 생성 된 각 Double을 ArrayList에 삽입 할 수 있었지만 목록에서 가장 큰 숫자를 찾는 방법을 찾지 못했습니다. 현재의 코드는 "java.lang.IndexOutOfBoundsException"오류를 발생시킵니다.

이것은 아마도 내가 ArrayList를 처음 사용하고 명령에 유창하지 못하고 작동하는 방식 때문일 수 있습니다.하지만 실제로 작동하지 않는 방법에 대해 도움을 주시면 감사하겠습니다. 동안.

import java.util.ArrayList; 
import java.util.Random; 
public class milran { 
    public static void main(String[] args) { 
     Random r = new Random(); 
     ArrayList<Double> myList = new ArrayList<Double>(); 
     for (int i = 1; i<=1000000; i++){ 
      double randomValue = 0.0+(1.0-0.0)*r.nextDouble(); 
      myList.add(randomValue); 

     } 
     double max = myList.get(1); 
     for (int z=2; z<=myList.size(); z++){ 
      double test = myList.get(z); 
      if (test>max){ 
       max = test; 
      } 
     } 
     System.out.println(max); 
    } 
} 

답변

0

ArrayList 시작은 0에서 요소를 계산합니다. myList.get(1)myList.get(0), int z=2int z=1, z<=myList.size()z<myList.size()으로 바꿔야합니다.

0

다음 줄 : for (int z=2; z<=myList.size(); z++) {이 잘못되었습니다. for (int z=1; z<myList.size(); z++) {이어야합니다.

이것은 배열과리스트가 0 기반이기 때문에 크기 2의 목록에는 2 개의 요소, 즉 인덱스 0과 인덱스 1이 있습니다. 현재 존재하지 않는 크기와 동일한 요소 번호로 인덱스하려고합니다.

동일한 줄에있는 myList.get(1);myList.get(0);이어야합니다.

이것은 사용자의 문제와 관련이 없지만이 줄의 0.0+(1.0-0.0)*r.nextDouble();r.nextDouble();으로 작성 될 수 있습니다. 0 + 1 - 0을 수행하여 무엇을하려고했는지 확실하지 않습니다.

3

우선 java.util.Collectionsjava.util.ArrayList에 대한 문서를 살펴보십시오. 1 - 배열 인덱스 0에서 시작하기 때문에 둘째로는, ArrayIndexOutOfBoundsException이 트리거되는 ...

for (int z=2; z<=myList.size(); z++){ 
     double test = myList.get(z); 
     ... 
} 

이 따라서 최종 요소() myList.size된다. 즉, z = myList.size() 일 때 범위를 벗어났습니다.

또한 첫 번째 for 루프에서는 i = 1; 1 <= 1000000을 사용하고 있습니다. i을 사용하여 배열 (또는 목록)의 각 요소를 터치 할 수 있으므로 i = 0; i < 1000000을 사용하는 것이 훨씬 의미가 있습니다.System.out.println(myList.get(myList.size() - 1)); :Collections.sort(myList);

  • 은 마지막 요소를 검색 : 여기

    for(i = 0; i < 1000000; i++) 
    { 
        // do something with myArray[i] 
    } 
    

    은 값이 삽입 된 후 나는

    1. 정렬을 ... 배열을 어떻게 할 것인지의

    ... 그게 전부입니다.

    실제 정렬을 구현해야하는 경우 Collection보다는 기본 double 배열 (double[])을 사용하는 것이 좋습니다.

    그렇지 않으면 컬렉션을 사용하는 경우 foreach 루프를 사용할 수 있습니다.

    for(Double d : myList) // for each Double 'd' in myList 
    { 
        // do something with d 
    } 
    

    N.B. double (프리미티브)에 2 루프

    double test = myList.get(z); 
    

    Double (오브젝트)로부터의 이러한 자동 전환이 광고의 또 다른 잠재적 인 문제는 unboxing 불린다. 거기에 성능 비용, 특히 백만 번 반복하면됩니다. 첫 번째 루프에서는 다른 방법으로 (오토 보쉬) - 백만 번 변환합니다.

  • +0

    왜 가장 큰 요소를 찾으려면 목록을 한 번만 스캔하는 대신 정렬하는 것이 좋습니다? –

    +0

    @PatriciaShanahan - 재사용을 목적으로합니다. 정렬되지 않은 배열은 시간이 지남에 따라 속도가 느려지는 경향이 있습니다. 2 번째로 큰 요소가 필요할 때 어떻게됩니까? 그럼 셋째? 배열 스캔 계속? 그게 O (n^2). Collections.sort (List list) – wfunston

    +0

    ^^ O (nlogn)와 O (n) – wfunston

    0

    다른 사람들이 이미 지적했듯이 for 루프 조건에서 인덱스가 범위를 벗어나는 오류가 발생했습니다.

    나중에이를 피할 수있는 방법 중 하나는 색인을 직접 관리하는 대신 Java for-each 루프 구문을 사용하는 것입니다.

    for (Double test : myList) { 
        if (test>max){ 
         max = test; 
        } 
    } 
    

    이 구문은 기존의 인덱스 for 구문보다는 의도가 훨씬 명확하게하고 잠재적 인 오류 지점이 당신의 손에서 (인덱스 및 목록의 경계를 관리) 제거합니다.

    관련 문제