3

配列内のすべての重複するインデックス値を見つけて一覧表示する必要があります。

例: int[] 配列 = { 0, 7, 9, 1, 5, 8, 7, 4, 7, 3};

7 は、インデックス 1、6、および 8 の 3 つの異なる場所にあります。重複した値の場所を outputResults.setText() に表示するには、既存のコードをどのように変更すればよいでしょうか? outputResults.setText() が役立つ場合は JTextField です。

String tmp1 = getNumbers.getText();
    try {
        int search = Integer.parseInt(tmp1);
        for (p = 0; p < array.length; p++) {
            if(array[p]==search) {
                b = true;
                index = p;
            }
        }   
        if(b==true)
            outputResults.setText(search + " was in the following fields of the array " + index);
         else 
            throw new NumberNotFoundException("Your number was not found.");


    } catch (NumberFormatException ex) {
        JOptionPane.showMessageDialog(getContentPane(), "You can only search for integers.");

    } catch (NumberNotFoundException ex) {
        JOptionPane.showMessageDialog(getContentPane(), ex.getMessage());
    }

現在の状態では、重複した番号が最後に見つかった時間のみがリストされます。これは、私の例に基づいてインデックス 8 になります。配列内の数値のリストはユーザーが入力するもので、値をソートすることはできません。私の当初の推測では、ネストされたループを作成し、重複した番号が見つかったときに p (検索している現在のインデックス) を新しい配列に追加することでした。次に、完全な配列を outputResults.setText() にリストしますが、試してみるといくつかの警告とエラーが発生しました。

完全なコードは、必要に応じてここで見つけることができます: http://pastebin.com/R7rfWAv0 そして、はい、完全なプログラムは混乱していますが、仕事は完了し、私はそれでとても頭痛がしていました. また、完全なプログラムでは、教授は重複した値が余分なクレジットとして検出された場合に例外をスローするように求めました。やったのですが、元の課題を終わらせるためにコメントアウトしたので無視してください。

4

5 に答える 5

1

Listインデックスを記録するには a を使用する必要があると思います

List<Integer> indexs =new ArrayList<Integer>();
for (p = 0; p < array.length; p++) {
    if(array[p]==search) {
        indexs.add(p);
    }
}
if(p.length()>0){
    //print the result
}
于 2012-06-18T17:30:52.297 に答える
1

2 つの for ループだけではどうですか?

for (int i = 0; i < array.length; i++) {
  for (int j = 0; j < array.length; j++) {
    if (array[i] == array[j]) {
      System.out.println("Duplicate - " + array[i] + " found at index " + i + " and " + j);
    }
  }
}
于 2016-10-04T01:53:33.980 に答える
1

ハッシュテーブル、リストなどは必要ありません。次のように非常に簡単に実行できます。

int [] array = { 0, 7, 9, 1, 5, 8, 7, 4, 7, 3};
int pointer=0;
int currNumber;
while(pointer<array.length)
{   
  currNumber=array[pointer];
  for(int i=0;i<array.length;i++){          
    if(currNumber==array[i] && i>pointer){
        System.out.println("Duplicate for "+currNumber +" in " +i);
        break;
    }
  }   
  pointer++;
}

配列内のすべての数値のすべての重複を出力します。

Duplicate for 7 in 6
Duplicate for 7 in 8

明らかに、おそらく文字列を連結し、ループの最後に次のように呼び出して表示する必要があります。outputResults.setText()

ここでデモ。

于 2012-06-18T17:58:30.340 に答える
0

配列を繰り返し処理していると、以前に見つかったインデックスが行で上書きされますindex = p;。この行は、検索対象の値が 1 回出現する場合にのみ機能します。文字index列にして、その行に到達するたびに連結して、index += " "+p;. あなたの行:

 outputResults.setText(search + " was in the following fields of the array " + index);

次に、検索されている値に対して見つかったすべてのインデックスを出力します。

したがって、ソリューションを完成させるにはいくつかの方法があります (単純な方法と最適な方法があります)。問題が発生した場合は、何を達成しようとしているのかを考え、コード (デバッグ) で各行が何をしているのかを把握する必要があります。

于 2012-06-18T17:41:41.953 に答える
0

1 つのオプションは、値をキーとして使用する HashMap と、値のインデックスのコレクションを作成することです。配列をスキャンするときに、値が HashMap にない場合は、インデックスの新しいコレクションと共に追加します。値が配列にある場合は、コレクションを取得し、次のインデックスを追加して反復を終了します。

それが完了したら、HashMap を繰り返します。size() > 1 の値を持つエントリには重複があります。

于 2012-06-18T17:31:33.340 に答える