4

私は2つの文字列を持っています:

A1=[Rettangolo, Quadrilatero, Rombo, Quadrato]
A2=[Rettangolo, Rettangolo, Rombo, Quadrato]

これを入手したい: 「「レッタンゴロ」ではなく「クアドリラテロ」を見つけました。removeAll()「レッタンゴロ」のインスタンスが 2つあるため、使用retainAll()しても機能しない場合。実際、 を使用するa1.containsAll(a2)と true になり、false が必要になります。

私のリクエストを検討してくれてありがとう。

4

5 に答える 5

5

ArrayList からremoveメソッドを使用します。最初に出現したもののみを削除します。

public static void main(String []args){
        //Create ArrayLists
        String[] A1 = {"Rettangolo", "Quadrilatero", "Rombo", "Quadrato"};
        ArrayList<String> a1=new ArrayList(Arrays.asList(A1));
        String[] A2 ={"Rettangolo", "Rettangolo", "Rombo", "Quadrato"};
        ArrayList<String> a2=new ArrayList(Arrays.asList(A2));
        // Check ArrayLists
        System.out.println("a1 = " + a1);
        System.out.println("a2 = " + a2);
        // Find difference
        for( String s : a1)
            a2.remove(s);
        // Check difference
        System.out.println("a1 = " + a1);
        System.out.println("a2 = " + a2);
}

結果

a1 = [Rettangolo, Quadrilatero, Rombo, Quadrato]
a2 = [Rettangolo, Rettangolo, Rombo, Quadrato]
a1 = [Rettangolo, Quadrilatero, Rombo, Quadrato]
a2 = [Rettangolo]
于 2013-06-04T15:30:13.940 に答える
1

ここに3つの解決策があります。

remove メソッドを使用する実装。

public static boolean same(List<String> list1, List<String> list2){
    if (list1.size() != list2.size())
        return false;
    List<String> temp = new ArrayList<String>(list1);
    temp.removeAll(list2);
    return temp.size() == 0;
}

ソートしてから比較するソリューション。

public static boolean same(List<String> list1, List<String> list2){
    if (list1.size() != list2.size())
        return false;
    Collections.sort(list1);
    Collections.sort(list2);
    for (int i=0;i<list1.size();i++){
        if (!list1.get(i).equals(list2.get(i)))
            return false;
    }
    return true;
}

そして、おふざけとして、2 つの配列の単語数の差を計算することで、これを行うことができます。最も効率的ではありませんが、機能し、おそらく役立つ可能性があります。

public static boolean same(List<String> list1, List<String> list2){
    Map<String,Integer> counts = new HashMap<String,Integer>();
    for (String str : list1){
        Integer i = counts.get(str);
        if (i==null)
            counts.put(str, 1);
        else
            counts.put(str, i+1);
    }
    for (String str : list2){
        Integer i = counts.get(str);
        if (i==null)
            return false; /// found an element that's not in the other
        else
            counts.put(str, i-1);
    }
    for (Entry<String,Integer> entry : counts.entrySet()){
        if (entry.getValue() != 0)
            return false;
    }
    return true;
}
于 2013-06-04T15:50:09.573 に答える
0

これにより、説明したこの特定のケースの2つの配列間の交差が見つかります。

String[] A1 = { "Rettangolo", "Quadrilatero", "Rombo", "Quadrato" };
String[] A2 = { "Rettangolo", "Rettangolo", "Rombo", "Quadrato" };
ArrayList<String> a1 = new ArrayList<String>(Arrays.asList(A1));
ArrayList<String> a2 = new ArrayList<String>(Arrays.asList(A2));
a1.removeAll(a2);
System.out.println("I have found " + a1);
于 2013-06-04T16:06:14.970 に答える
0

これがお役に立てば幸いです

    String[] A1 =  {"Rettangolo", "Quadrilatero", "Rombo", "Quadrato"};
    String[] A2 ={"Rettangolo", "Rettangolo", "Rombo", "Quadrato"};

    Set<String> set1 = new HashSet<String>();
    Set<String> set2 = new HashSet<String>();

    set1.addAll(Arrays.asList(A1));
    set2.addAll(Arrays.asList(A2));

    set1.removeAll(set2);
    System.out.println(set1);// ==> [Quadrilatero]
于 2013-06-04T16:20:54.617 に答える