2017-02-03 3 views
-2

約20,000の値からなるファイルから作成されたArrayList内の重複する整数の数を数えようとしていますキャラクター。私の現在のコードは、私が簡単に変更することができない、特定のリストを除いて、すべてのリストに対して機能します。私のプログラムは特定のリスト内のすべての重複数をカウントしませんが、他のすべてに対して有効です

//Arrays Class, use numerical sorting method 
    //Read in each number and look for duplicates, return the number of duplicates. 
    System.out.println("Creating List....."); 
    File numbers = new File("src/testlist"); 
    List<Integer> numberlist = new ArrayList<Integer>(); 

    try { 

     Scanner input = new Scanner(numbers); 
     while(input.hasNextInt()){ 
      //int number = input.nextInt(); 
      numberlist.add(input.nextInt()); 
      //System.out.println(number); 

     } 
     System.out.println("List Created"); 
     input.close(); 
    }catch(FileNotFoundException e) { 
     e.printStackTrace(); 
    }catch(NoSuchElementException r){ 
     r.printStackTrace(); 
     System.out.println("oops"); 
    } 
    System.out.println("Sorting Numerically....."); 
    Collections.sort(numberlist); 
    System.out.println(numberlist); 
    System.out.println("Counting Duplicate Numbers....."); 
    int duplicates = 0; 
    for(int i = 0; i < numberlist.size()-1; i++){ 
     if(numberlist.get(i) == numberlist.get(i+1)){ 
      duplicates++; 
      numberlist.remove(i); 
     } 
    } 
    System.out.println("Duplicates: " + duplicates); 

ファイルimはhereです。 私はこのプログラムが意図したとおりに動作することを証明するために他の手作りのテストデータを試しましたが、この特定のリストは私に問題をもたらしています。

+1

あなたが立ち往生している現在のリストの出力は何ですか? –

+1

なぜこのステップを実行しているのですか? '' numberlist.remove(i); '' – osanger

+0

現在の要素( 'remove(i)')を削除すると、次の要素はその位置になりますが、ループ 'i'がインクリメントされ、位置にシフトされた要素は評価されませんでした。 'remove()'を実行するときに 'i'を減らす必要があるので、ループの' i ++ 'は' i'を変更しません。 – Andreas

答えて

0

あなたはサイクルのため

numberList.remove(i) 

行う一つの要素をスキップします。実際、要素番号iを削除し、次の評価は番号iから、i+1ではなく続行する必要があります。

インデックスが反復している間にリスト要素を変更すると、インデックスが変わってしまいます。そのようなことを行うのは決して良い方法ではありません。

これを実行する最もクリーンな方法は、何も削除せずにソースリストを保持し、新しいリストに要素をコピーし、重複をスキップすることです。

このようにすると、結果(重複のないリスト)と新しいリストが作成され、その数はこのリストのサイズから簡単に計算されます。私は、コメントで述べた

numberList.remove(i) 

を削除し、あなたのループはあなたが必要との重複をカウントするようaspected

簡単な方法を動作しますが、セットにリストをキャストとサイズを比較している

0

尻両方の。あるセットでは、すべての値が一意です。

Set<Integer> set = new HashSet<Integer>(numberList); 

System.out.println(numberList.size() - set.size()); 
0
public static void countDuplicates() { 
    Integer count = 0; 
    List<Integer> list = getNumbersFromFile(); 
    Set<Integer> unique = new HashSet<Integer>(list); 
    for (Integer key : unique) { 
     if (Collections.frequency(list, key) > 1) { 
      count++; 
     } 
    } 
    System.out.println("Count Of Duplicates " + count); 
} 

public static List<Integer> getNumbersFromFile() { 
    File numbers = new File("src/numbers.txt"); 
    List<Integer> numberlist = new ArrayList<Integer>(); 

    try { 

     Scanner input = new Scanner(numbers); 
     while (input.hasNextInt()) { 
      // int number = input.nextInt(); 
      numberlist.add(input.nextInt()); 
      // System.out.println(number); 

     } 
     System.out.println("List Created"); 
     input.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (NoSuchElementException r) { 
     r.printStackTrace(); 
     System.out.println("oops"); 
    } 
    return numberlist; 
} 
関連する問題