web-dev-qa-db-ja.com

ArrayListのすべてのアイテムを他のすべてのアイテムと比較します

私は非常に単純な問題だと思っていたものに問題があります。

ArrayList内のすべての項目を、リスト内の他のすべての項目と比較する必要があります。項目を自分自身と比較する必要はありません。 equals()比較を呼び出すほど簡単ではありません。以下のコードでは省略したカスタムロジックが含まれています。また、ArrayListは決して変更しないでください。

私が抱えていると思われる問題は、2番目のループに入ると、比較する別のオブジェクトがあるかどうかわからないことです(可変サイズのリストなので)。

for(int i =0; i< list.size(); i++){ 
    //get first object to compare to
    String a = list.get(i).getA();

    Iterator itr = list.listIterator(i + 1 ); // I don't know if i + 1 is valid
    while(itr.hasNext()){
        // compare A to all remaining items on list
    }
}

私はおそらくこれについて間違った方法で行っていると思う、私はこれをより良くする方法についての提案やヒントを受け入れています。

16
JavaKungFu
for (int i = 0; i < list.size(); i++) {
  for (int j = i+1; j < list.size(); j++) {
    // compare list.get(i) and list.get(j)
  }
}
35
Kaleb Brasee

外側と同様に、内部でforループを使用することの問題は何ですか?

for (int j = i + 1; j < list.size(); ++j) {
    ...
}

一般に、Java 5なので、反復子は1回または2回しか使用しませんでした。

2
Nikita Rybak

場合によっては、これが最良の方法です。コードに何か変更が加えられている可能性があり、j = i + 1はそれをチェックしないからです。

for (int i = 0; i < list.size(); i++){  
    for (int j = 0; j < list.size(); j++) {
                if(i == j) {
               //to do code here
                    continue;
                }

}

}

2
Piotr Jankowski

次のコードは、contains()メソッドを使用して各アイテムを他のアイテムリストと比較します。forループの長さは、大きなリストのsize()より大きくする必要があり、それだけで両方のリストのすべての値を比較します。

List<String> str = new ArrayList<String>();
str.add("first");
str.add("second");
str.add("third");
List<String> str1 = new ArrayList<String>();
str1.add("first");
str1.add("second");
str1.add("third1");
for (int i = 0; i<str1.size(); i++)
{
System.out.println(str.contains(str1.get(i)));
}

出力はtrue true falseです

0
Karthick

このコードは、この動作を得るのに役立ちました:リストa、b、cでは、ab、ac、およびbcを比較する必要がありますが、他のペアは過剰/不要です。

import Java.util.*;
import static Java.lang.System.out;

// rl = rawList; lr = listReversed
ArrayList<String> rl = new ArrayList<String>();
ArrayList<String> lr = new ArrayList<String>();
rl.add("a");
rl.add("b");
rl.add("c");
rl.add("d");
rl.add("e");
rl.add("f");

lr.addAll(rl);
Collections.reverse(lr);

for (String itemA : rl) {
    lr.remove(lr.size()-1);
        for (String itemZ : lr) {
        System.out.println(itemA + itemZ);
    }
}

ループは次の図のようになります。 三角比較の視覚的な例

またはこれとして:

   |   f    e    d    c    b   a
   ------------------------------
a  |  af   ae   ad   ac   ab   ·
b  |  bf   be   bd   bc   ·   
c  |  cf   ce   cd   ·      
d  |  df   de   ·         
e  |  ef   ·            
f  |  ·               

合計の比較は、三角形の数(n * n-1)/ 2です

0
BrnLng