2015-01-14 2 views
1

링크 된 목록에서 고유 번호의 모양을 계산하는 알고리즘을 구현 중입니다. 문제는 입력이 1 1 1 2 2 2Java가 배열에 잘못된 데이터를 씁니다.

대신 출력 받고 같은

1 외관 3 회
이 모양 일 때하는 나는, 모양을 믿는다 for 루프에 3 번

나는 3
모습

1 얻고있다 입력 1 2 3 4 5 6 7 8 9 사랑의 외관 17,451,515,0 0

는 I 인덱스에서 예외 어레이를 얻었다. 여기 코드는

public static void main(String[] args) { 
    LinkedList<Integer> list = new LinkedList<Integer>(); 
    Scanner user_input = new Scanner(System.in); 
    String input = user_input.nextLine(); 
    //Getting user input, if the user enter an empty line(enter, enter) the loop will die 
    while(input.length() > 0){ 
     list.add(Integer.parseInt(input)); 
     input = user_input.nextLine(); 
    } 
    Collections.sort(list); //sorting the input 
    //Getting the number of unique numbers 
    int count_of_unique_numbers = 1;// There will be atleast one unique number 

    if(!list.isEmpty()){ 
     int temp = list.get(0); 
     for(int i = 1;i < list.size(); i++){ 
      if(temp != list.get(i)){ 
       count_of_unique_numbers++; 
       temp = list.get(i); 
      } 
     } 
    } 
    else{ 
     System.out.println("The list is empty"); 
     return; 
    } 
    //Counting how many times the unique numbers apper; 
    int number_appearance[][] = new int[count_of_unique_numbers][2]; 
    int temp = list.get(0); 
    int counter = 1; 
    int j = 0; 
    for(int i = 1;i < list.size();i++){ 
     if(temp == list.get(i)){ counter++; } 
     else{ 
      number_appearance[j][0] = temp; 
      number_appearance[j][1] = counter; 
      counter = 1; 
      temp = list.get(i); 
      j++; 
     } 
    } 
    //Printing the number_appearance array 
    for(int i = 0; i < count_of_unique_numbers; i++){ 
     System.out.println("The number: " + number_appearance[i][0] + " appearece " + number_appearance[i][1] + " times"); 
    } 
} 
+0

* * 당신이 예외를 얻고있다, 당신은 그것을 통해 디버깅 있나요? –

+0

(* 다른 * 번호를 발견했을 때만 쓸 수 있기 때문에 최종 번호를 귀하의 목록에 쓰지 마십시오.) –

+0

세 번째 for 루프에서 if 조건에서 얻으 려 할 때 i 번째 요소 [temp == list.get (i)] – justNoob

답변

0

:

for(int i = 1;i < list.size();i++){ 
    if(temp == list.get(i)){ counter++; } 
    else{ 
     System.out.println(temp+":"+counter); 
     number_appearance[j][0] = temp; 
     number_appearance[j][1] = counter; 
     counter = 1; 
     temp = list.get(i); 
     j++; 
    } 
} 
number_appearance[j][0] = temp; // added 
number_appearance[j][1] = counter; // added 

입력 :

1 1 1 2 2 2 

출력 :

The number: 1 appearece 3 times 
The number: 2 appearece 3 times 

입력 :

1 2 3 4 5 6 7 8 9 

출력 :

The number: 1 appearece 1 times 
The number: 2 appearece 1 times 
The number: 3 appearece 1 times 
The number: 4 appearece 1 times 
The number: 5 appearece 1 times 
The number: 6 appearece 1 times 
The number: 7 appearece 1 times 
The number: 8 appearece 1 times 
The number: 9 appearece 1 times 
0

당신은 단순히 Collections.frequency는 JDK 1.6

+0

이것은 어떤 소프트웨어에도 필요하지 않은 운동입니다. 그리고 저는 알고리즘을 직접 만들고 싶습니다. 그러나 당신의 도움에 감사드립니다. – justNoob

0

때문에 나는 원래 이렇게하려고했던 게 아니에요 알고 있지만, 그것은 것 사용할 수 있는지

List<Integer> foundNumbers = new ArrayList<Integer>(); 
for(int i = 0; i < list.size(); i++) 
{ 
    if(foundNumbers.contains(list.get(i)) 
    { 
     System.out.println(list.get(i) + " appearance " + Collections.frequency(list, list.get(i) + " times."); 
     foundNumbers.add(list.get(i)); 
    } 
} 

참고를 할 수 더 쉽게 할 수 있습니다. Map

public static void main(String[] args) { 
    LinkedList<Integer> list = new LinkedList<Integer>(); 
    Scanner user_input = new Scanner(System.in); 
    String input = user_input.nextLine(); 
    // Getting user input, if the user enter an empty line(enter, enter) the loop will die 
    while (input.length() > 0) { 
     list.add(Integer.parseInt(input)); 
     input = user_input.nextLine(); 
    } 
    Collections.sort(list); // sorting the input 
    Map<Integer, Integer> count = new HashMap<Integer, Integer>(); 
    for (int i : list) { 
     if (count.containsKey(i)) { 
      count.put(i, count.get(i) + 1); 
     } 
     else { 
      count.put(i, 1); 
     } 
    } 

    for (Map.Entry<Integer, Integer> num : count.entrySet()) { 
     System.out.println("The number: " + num.getKey() + " appearece " + num.getValue() + " times"); 
    } 
} 
+0

나는 아직도지도에 익숙하지 않다. 하지만이 이론을 읽을 때까지이 코드를 보관 해 주셔서 감사합니다. – justNoob

+0

와우, 나는 우연히 너를 우연히 복사 한 것처럼 느낀다. –

+0

@austinwernli 동일하지 않다. 맞춤법 오류를 수정했다. :) –

1

저것까지.

Map < String, Integer > numMap = new HashMap < String, Integer >(); 
Scanner user_input = new Scanner(System. in); 
String input = user_input.nextLine(); 

String[] inputArray = input.split(" "); 
for (String s: inputArray) { 
    if (numMap.containsKey(s)) { 
     numMap.put(s, numMap.get(s) + 1); 
    } else { 
     numMap.put(s, 1); 
    } 
} 

for (Map.Entry < String, Integer > entry: numMap.entrySet()) { 
    System.out.println("number: " + entry.getKey() + " appeared: " + entry.getValue() + " times"); 
} 
당신은 현재 그리워 최종 숫자의 발행 수의 수를 추가하여 문제를 해결할 수
+0

음, 해당 맵의 키를 String으로 변경하면 정수로의 변환을 피할 수 있고 사용자가 실제로 입력 했는지도 신경 쓸 필요가 없다. 숫자 또는 아닙니다. – Tom

+0

사실, 그 대답을 반영하도록 업데이트했습니다. 고맙습니다. –

관련 문제