2

私がやりたいのは、ある配列を別の配列と比較し、比較する配列で重複が見つかった場合、次のステートメントをスキップすることです。これが私が現時点で持っているものです

for (int count=0; count < userId.length; count++) {
    for (int integer=0; userId[count] != excluded[integer]; integer++) {
        // The arrays hold either string or Long variables in them
        // Continued code to finish off after checking array
    }
}

私がやりたいのは、これを機能させることですが、可能ですが、同時にできるだけシンプルに保ちます。コードが実際にはまったく明確ではない場合に備えて、2つの配列userIdとexcludedを比較したいのですが、配列内のuserId値のいずれかがexcludedのいずれかに一致する場合、配列の状態のようにそれらをリスト。

編集:実行(excluded[counts].contains(user))
中に特定の出力が得られた場合、「素晴らしい!」と思っていました。
しかし、私が今抱えている問題は、除外された値を取得したかのように if を実行する(!excluded[counts].contains(user))<br> と、いくつかの多くの値が繰り返され、
例を示すものを差し引いたものになります。

String[] userId = new String [] { "10", "15", "17", "20", "25", "33", "45", "55", "77" }
String[] excluded = new String[] { "15", 20", "55", "77" }

次に、ループに移動して配列をチェックします

int count=0;
for (String user : userId) {
for (int counts=0; counts < excluded.length; counts++) {
if (!excluded[counts].contains(user)) {
System.out.println("UID = " + userID[count]);
}
count++

その !excluded は、表示したくない userId のインスタンスを引き続き表示するため、除外したい場合でも「UID = 15」と表示されますが、表示されるのではなく、一度だけ表示されます4回 3回見ました。

4

3 に答える 3

3

コレクションフレームワークを使用してこれを行うだけです。ID がint値であると仮定します。

int[] excluded = ... ;
int[] userIds = ... ;
Set<Integer> excludedIds = new HashSet<Integer>(Arrays.asList(excluded));
for (int userId : userIds) {
    if (excluded.contains(userId))
        continue;
    // Do something with ID
}

userIdsこれを行うこともできますが、これは配列内の重複を気にしないことを前提としています:

int[] excluded = ... ;
int[] userIds = ... ;
Set<Integer> excludedIds = new HashSet<Integer>(Arrays.asList(excluded));
Set<Integer> userIdSet = new HashSet<Integer>(Arrays.asList(userIds));
userIdSet.removeAll(excludedIds);
for (int userId : userIdSet) {
    // Do something with ID
}

これはより最適化されていますが、多数の IDを持っていない限り、特に必要ではありません。あなたのアルゴリズムはO(n) = n 2です。ここでの私のアルゴリズムは O(n ) = nです。

于 2012-09-19T20:11:03.970 に答える
2

除外された ID をセットに入れます。

Set<Integer> excludedSet = new HashSet<Integer>();
for (int i : excluded) {
  excludedSet.add(i);
}

次に、ループは次のようになります。

for (int id : userId) {
    if (!excludedSet.contains(id)) {
        // process this user
    }
} 
于 2012-09-19T20:09:40.333 に答える
1

このタスクを複数回実行する必要がない限り、最適化は気にしません。

それ以外の場合、最善の解決策は、2 番目の配列の項目をSetに入れ、その効率的なメソッド (contains) を使用して、コレクションに項目があるかどうかを解決することです。

于 2012-09-19T20:08:02.703 に答える