0

配列内の個別の数値を出力する小さなプログラムを作成しようとしています。たとえば、ユーザーが1,1,3,5,7,4,3と入力した場合、プログラムは1,3,5,7,4のみを出力します。

関数のelseif行でエラーが発生しますcheckDuplicate

これまでの私のコードは次のとおりです。

import javax.swing.JOptionPane;

public static void main(String[] args) {
    int[] array = new int[10];
    for (int i=0; i<array.length;i++) {
        array[i] = Integer.parseInt(JOptionPane.showInputDialog("Please enter"
                                  + "an integer:"));
    }
    checkDuplicate (array);
}

public static int checkDuplicate(int array []) {
    for (int i = 0; i < array.length; i++) {
        boolean found = false;
        for (int j = 0; j < i; j++)
            if (array[i] == array[j]) {
                found = true;
                break;
            }
        if (!found)
            System.out.println(array[i]);
    }
    return 1;
}
}
4

8 に答える 8

10

最も簡単な方法は、すべての要素を に追加してから、Set<Integer>の内容を出力するだけSetです。

于 2009-03-23T18:25:42.650 に答える
4

まず第一に、" else if" ステートメントは間違っています。if に条件を指定していないからです (if が必要な場合は、" if (condition) ..." と書く必要があります)。

第 2 に、値を出力する必要があるかどうかを内側のループ内で決定することはできません。コードが機能する方法では、array[i]とは異なる値 array[j] ごとに値 array[i] を記述します。

3 番目: 内側のループは 0 から外側のインデックスに移動するだけで済みi-1ます。各要素について、それが最初の出現であるかどうか (つまり、同じ値が以前のインデックスで発生したかどうか) を決定するだけで済みます。ある場合は印刷し、ない場合は無視してください。

の適切な実装は次のCheckDuplicate()ようになります。

public static void checkDuplicate(int array []) {
  for (int i = 0; i < array.length; i++) {
    boolean found = false;
    for (int j = 0; j < i; j++)
      if (array[i] == array[j]) {
        found = true;
        break;
      }
    if (!found)
      System.out.println(array[i]);
  }
}

しかしもちろん、より大きな配列では、ある種のSet方法がはるかに効率的です...


編集:もちろん、mmyersCheckDuplicate() (コメントを参照)は、値を返さないため、void(の代わりに)戻り値の型を持つ必要があると言って正しいintです。上記のコードでこれを修正しました...

于 2009-03-23T18:54:28.820 に答える
3

それらを挿入時間順に並べたセットに入れ、必要に応じて配列に戻します。

new LinkedHashSet<Integer>(array).toArray()
于 2009-03-23T18:28:11.270 に答える
2

必要なことは、JavaコレクションAPIを使用して実現できますが、コレクションメソッドObjectはプリミティブではなくsで機能するため、ワンライナーとして正確に機能するわけではありません。J2SEには、たとえばに変換するメソッドがありませんint[]Integer[]、Apache Commons Langライブラリには、 ArrayUtils.toObject()ArrayUtils.toPrimitive()などの便利なメソッドが含まれています。

それらを使用すると、整数配列から重複要素を削除するメソッドは次のようになります。

public static int[] removeDuplicates(int... array) {
    Integer[] ints = ArrayUtils.toObject(array);
    Set<Integer> set = new LinkedHashSet<Integer>(Arrays.asList(ints));
    return ArrayUtils.toPrimitive(set.toArray(new Integer[set.size()]));
}

アプリケーションに配列/コレクションの操作が多く含まれている可能性がある場合は、最初から実装するのではなく、そのライブラリを確認することをお勧めします。ただし、学習目的でそれを行っている場合は、コードを削除してください。

于 2009-03-23T20:55:10.310 に答える
2

すべての整数をセットに投げてみてください。重複がセットに追加されることはなく、一意の整数のセットが残ります。

于 2009-03-23T18:26:02.383 に答える
1

配列ではなくSet実装に各数値を追加する方がおそらく良いでしょう。セットは、重複を除外したい要素のコレクションを格納するためのものです。

于 2009-03-23T18:26:31.697 に答える
1

他の人が提案したようにセットを使用するか、リスト互換クラスを使用してください。リスト互換クラスでは、Contains メソッドを使用して、配列に既に存在するかどうかを確認します。

于 2009-03-24T05:26:30.517 に答える
0

java.util.Scanner をインポートします。public class PrintDistinctNumbers {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    int [] numberArray = createArray();
    System.out.println("The number u entered are:   ");
    displayArray(numberArray);
    getDistinctNumbers(numberArray);
}

public static int[] createArray() {
    Scanner input = new Scanner(System.in);
    int [] numberCollection = new int [10];
    System.out.println("Enter 10 numbers");

    for(int i = 0; i < numberCollection.length; i++){
        numberCollection[i] = input.nextInt();
    }
    return numberCollection;

}

public static void displayArray(int[] numberArray) {
    for(int i = 0; i < numberArray.length; i++){
        System.out.print(numberArray[i]+" ");
    }
}

public static void getDistinctNumbers(int[] numberArray) {
    boolean isDistinct = true;
    int temp = 0;
    int [] distinctArrayNumbers = new int [10];
    for ( int i = 0; i < numberArray.length; i++){
        isDistinct = true;
            temp = numberArray[i];

            for( int j = 0; j < distinctArrayNumbers.length; j++){
                if( numberArray[i] == distinctArrayNumbers[j] ){
                isDistinct = false;
            }


           }
            if(isDistinct){
                    distinctArrayNumbers[temp]=numberArray[i];
                    temp++;
                }


    }
    displayDistinctArray(distinctArrayNumbers);
}

public static void displayDistinctArray(int[] distinctArrayNumbers) {
    for( int i = 0; i < distinctArrayNumbers.length; i++){
        if(distinctArrayNumbers[i] != 0){
        System.out.println(distinctArrayNumbers[i]);
        }
    }
}

}

于 2013-04-07T05:02:31.967 に答える