2つのリストがあります(Javaリストではなく、2つの列を言うことができます)
例えば
**List 1** **Lists 2**
milan hafil
dingo iga
iga dingo
elpha binga
hafil mike
meat dingo
milan
elpha
meat
iga
neeta.peeta
同じ要素の数を返すメソッドが必要です。この例では、3になり、リストと異なる値の両方で同様の値が返されます。
はいの場合、ハッシュマップを使用する必要がありますか?
助けてください
追伸:学校の宿題ではありません:)
編集
2つのバージョンがあります。 1つはArrayList
を使用し、もう1つはHashSet
を使用します
それらを比較し、必要なものが得られるまで、これからownバージョンを作成します。
これは以下をカバーするのに十分なはずです:
P.S:学校の課題ではありません:)だから、あなたが私を案内するだけで十分だとしたら
あなたの質問の一部。
元の回答を続ける:
そのためにJava.util.Collection
やJava.util.ArrayList
を使用できます。
retainAll メソッドは次のことを行います。
指定されたコレクションに含まれるこのコレクションの要素のみを保持
このサンプルを参照してください。
import Java.util.Collection;
import Java.util.ArrayList;
import Java.util.Arrays;
public class Repeated {
public static void main( String [] args ) {
Collection listOne = new ArrayList(Arrays.asList("milan","dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta"));
Collection listTwo = new ArrayList(Arrays.asList("hafil", "iga", "binga", "mike", "dingo"));
listOne.retainAll( listTwo );
System.out.println( listOne );
}
}
編集
2番目の部分(同様の値)には、 removeAll メソッドを使用できます。
指定されたコレクションにも含まれているこのコレクションの要素をすべて削除します。
この2番目のバージョンでは、同様の値とハンドルが(破棄することで)繰り返されます。
今回はCollection
がSet
の代わりにList
になる可能性があります(違いは、セットは繰り返し値を許可しないことです)
import Java.util.Collection;
import Java.util.HashSet;
import Java.util.Arrays;
class Repeated {
public static void main( String [] args ) {
Collection<String> listOne = Arrays.asList("milan","iga",
"dingo","iga",
"elpha","iga",
"hafil","iga",
"meat","iga",
"neeta.peeta","iga");
Collection<String> listTwo = Arrays.asList("hafil",
"iga",
"binga",
"mike",
"dingo","dingo","dingo");
Collection<String> similar = new HashSet<String>( listOne );
Collection<String> different = new HashSet<String>();
different.addAll( listOne );
different.addAll( listTwo );
similar.retainAll( listTwo );
different.removeAll( similar );
System.out.printf("One:%s%nTwo:%s%nSimilar:%s%nDifferent:%s%n", listOne, listTwo, similar, different);
}
}
出力:
$ Java Repeated
One:[milan, iga, dingo, iga, elpha, iga, hafil, iga, meat, iga, neeta.peeta, iga]
Two:[hafil, iga, binga, mike, dingo, dingo, dingo]
Similar:[dingo, iga, hafil]
Different:[mike, binga, milan, meat, elpha, neeta.peeta]
必要なことを正確に行わない場合は、ここから処理できるように良いスタートを切ることができます。
読者への質問:すべての繰り返し値をどのように含めますか?
intersection()
および subtract()
の CollectionUtils
のメソッドを試すことができます。
intersection()
メソッドは、共通の要素を含むコレクションを提供し、subtract()
メソッドは、一般的でない要素をすべて提供します。
彼らはまた、同様の要素の世話をする必要があります
これらは本当に リスト (順序付き、重複あり)、または セット (順序なし、重複なし)ですか?
後者の場合、たとえば Java.util.HashSet<E>
を使用し、便利な retainAll
を使用して予想される線形時間でこれを実行できるためです。
List<String> list1 = Arrays.asList(
"milan", "milan", "iga", "dingo", "milan"
);
List<String> list2 = Arrays.asList(
"hafil", "milan", "dingo", "meat"
);
// intersection as set
Set<String> intersect = new HashSet<String>(list1);
intersect.retainAll(list2);
System.out.println(intersect.size()); // prints "2"
System.out.println(intersect); // prints "[milan, dingo]"
// intersection/union as list
List<String> intersectList = new ArrayList<String>();
intersectList.addAll(list1);
intersectList.addAll(list2);
intersectList.retainAll(intersect);
System.out.println(intersectList);
// prints "[milan, milan, dingo, milan, milan, dingo]"
// original lists are structurally unmodified
System.out.println(list1); // prints "[milan, milan, iga, dingo, milan]"
System.out.println(list2); // prints "[hafil, milan, dingo, meat]"
Java 8 removeIfの使用
public int getSimilarItems(){
List<String> one = Arrays.asList("milan", "dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta");
List<String> two = new ArrayList<>(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); //Cannot remove directly from array backed collection
int initial = two.size();
two.removeIf(one::contains);
return initial - two.size();
}
2つのコレクションの等価性をテストする便利な方法を探している場合は、org.Apache.commons.collections.CollectionUtils.isEqualCollection
を使用できます。これは、順序に関係なく2つのコレクションを比較します。
List Compare でリスト比較の非常に基本的な例を見つけました。この例では、最初にサイズを検証してから、別のリストの特定の要素の可用性を確認します。
hash1
およびhash2
を想定
List< String > sames = whatever
List< String > diffs = whatever
int count = 0;
for( String key : hash1.keySet() )
{
if( hash2.containsKey( key ) )
{
sames.add( key );
}
else
{
diffs.add( key );
}
}
//sames.size() contains the number of similar elements.
シンプルなソリューション:-
List<String> list = new ArrayList<String>(Arrays.asList("a", "b", "d", "c"));
List<String> list2 = new ArrayList<String>(Arrays.asList("b", "f", "c"));
list.retainAll(list2);
list2.removeAll(list);
System.out.println("similiar " + list);
System.out.println("different " + list2);
出力:-
similiar [b, c]
different [f]
すべてのアプローチの中で、org.Apache.commons.collections.CollectionUtils#isEqualCollection
を使用するのが最善のアプローチであることがわかりました。理由は次のとおりです-
Apache.commons.collections
を依存関係として使用できない場合は、効率がよいため、リストの等価性をチェックするために、従うアルゴリズムを実装することをお勧めします。