1

これは私が苦労している宿題の質問です。

配列をソートしましたが、別の配列を使用して、最初の配列を反復処理し、隣接する項目を比較して重複を削除し、重複していないものを新しい配列に追加する必要があります。完了したら、古い配列 = を新しい配列に設定します。私はJavaに慣れていないため、反復を正しく設定していると思われるいくつかの問題に遭遇しています。

public static void main(String[] args) {
    args = new String[] { "data/list1.txt" };
    StdIn.fromFile("data/list2.txt");
    // StdOut.toFile ("finished.txt");
    int[] whitelist = In.readInts(args[0]);

    Arrays.sort(whitelist);
    int newArray[] = new int[whitelist.length];
    for (int i = 0; i < whitelist.length-1; i++) {
        int k = 0;
        if(whitelist[i+1] > whitelist[i])
            newArray[k] = whitelist[i];
            k++;
        StdOut.println(java.util.Arrays.toString(whitelist));
        whitelist = newArray;
        }
    for (int i=0; i<newArray.length;i++){
        StdOut.println(java.util.Arrays.toString(newArray));
    }

このコード片はより大きな二分探索の一部ですが、これは私が問題を抱えている部分です。

重複が削除されていないことに加えて、私の出力も数回出力されます。

どんな方向性でも大歓迎です。

4

4 に答える 4

1

コレクションを使用しないなどの制限があるため、コードを次のように書き直すと、次のように機能します。

    Arrays.sort(whitelist);
    int newArray[] = new int[whitelist.length];
    newArray[0] = whitelist[0];
    int k = 1;
    for (int i = 0; i < whitelist.length - 1; i++) {
        if(whitelist[i+1] > whitelist[i]) {
            newArray[k] = whitelist[i + 1];
            k++;
        }
    }
    newArray = Arrays.copyOf(newArray, k);
    whitelist = newArray;
    System.out.println(Arrays.toString(newArray));
于 2013-01-17T19:49:02.090 に答える
0

は最初のif命令にのみ適用され、k++ は反復ごとにインクリメントされます。以下を使用する必要があります。

if (whitelist[i+1] > whitelist[i]) {
        newArray[k] = whitelist[i];
        k++;
}

また、最初のループでは、最初の操作の後でもwhilelistwithを上書きしてnewArrayいます。これを の外に移動するつもりだったと思いますfor:

StdOut.println(java.util.Arrays.toString(whitelist));
whitelist = newArray;
于 2013-01-17T17:25:16.510 に答える
0

一般的に言えば、equals() と hashCode() を正しく定義して、オブジェクトの「複製」という言葉が何を意味するかを定義する必要があります。ただし、(ボックス化/ボックス化解除を通じて) プリミティブとラッパーを使用するため、ここでそれを行う必要はありません。

次に、配列をいくつかの Set コレクションに入れる必要があります。すべての重複は自動的に削除されます。その後、セットを配列に戻します。

Java 組み込みメカニズムは、最も最適化された方法で重複を削除します。手動で行う必要はありません。

    Integer[] whitelistI = null;
    Set set = new HashSet(Arrays.asList(whitelist));
    whitelistI = (Integer []) set.toArray(new Integer[set.size()]);

プリミティブの配列が必要な場合は、whitelistI からコピーできます。

さらに、これは間違っています:

int newArray[] = new int[whitelist.length];

新しい配列は元の配列と同じ長さになりますが、重複を削除したいと言いました。重複を削除すると、実際のサイズが短くなり、新しい配列には空の値が含まれます (この場合は - 0 (ゼロ))。

于 2013-01-17T18:41:51.680 に答える
0

紙にアルゴリズムを概説することで、あらゆる作業を開始するのに役立ちます。インタビュー用にコーディングする必要がある場合に役立ちます。

于 2013-01-17T17:47:10.773 に答える