-8
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import com.google.common.collect.*;
public class start {
    public static void main(String[] args) {
        start ex = new start();
        ex.doWork();

    }
    public void doWork(){
        List<String> asu2 = new ArrayList<String>();             // Create and initialization Lists
        List<String> rzs = new ArrayList<String>();                //        Order collection in descending order
        List<String> same = new ArrayList<String>();
        for (int j=0;j<10;j++) {
            for (int i=0;i<2;i++){ asu2.add("M1");}
            asu2.add("M2");
            asu2.add("M3");
            asu2.add("M4");
            asu2.add("M5"); }
        System.out.println("Asu size :"+asu2.size());
        List<String> asu = Ordering.natural().sortedCopy(asu2);      //        Order collection in direct order
        Collections.reverse(asu);
        for (int j=0;j<5;j++) {
            for (int i=0;i<2;i++){ rzs.add("M1");}
            rzs.add("M2");
            rzs.add("M3");
            rzs.add("M4");
            rzs.add("M5"); }
        for (int j=0;j<3;j++) {
            for (int i=0;i<2;i++){ rzs.add("M1M2");}
            rzs.add("M2M3");
            rzs.add("M3M4");
            rzs.add("M4M5");
        }
        for (int j=0;j<2;j++) {
            for (int i=0;i<2;i++){ rzs.add("M1M2M3");}
            rzs.add("M2M3M4");
            rzs.add("M3M4M5");
            rzs.add("M1M4M5");
            rzs.add("M1M2M5");
        }
        System.out.println("Rzs size: "+rzs.size());


        for (int i=0;i<asu.size();i++){                                       // Поиск элементов типа M1<-->M1
            for (int j=0;j<rzs.size();j++)    {
                if (asu.get(i).equals(rzs.get(j)))
                {  System.out.println("("+asu.get(i)+") ASU <--> ("+rzs.get(j)+") RZS ");
                    System.out.println("i+ "+i+" j: "+j);
                    same.add(asu.get(i));
                    asu.remove(i); rzs.remove(j);
                }
            }
        }
        for (int i=0;i<asu.size();i++){                                        // Поиск элементов M1<-->M1M2
            for (int j=0;j<rzs.size();j++)    {
                if ((asu.get(i).equals(rzs.get(j))) | rzs.get(j).contains(asu.get(i)))
                {  System.out.println("("+asu.get(i)+") ASU <--> ("+rzs.get(j)+") RZS ");
                    same.add(asu.get(i));
                    asu.remove(i); rzs.remove(j);
                }
            }
        }
        System.out.println("Same size: " + same.size());
        System.out.println("Rzs size: "+rzs.size());
        for (int i=0;i<rzs.size();i++)
            System.out.println(rzs.get(i));
        System.out.println("Asu size: "+asu.size());
        for (int i=0;i<asu.size();i++)
            System.out.println(asu.get(i));




    }
}

結果:

Same size: 55
Rzs size: 2
M2M3
M3M4
Asu size: 5
M4
M2
M1
M1
M1

ロジックはこうです。の場合((asu.get(i).equals(rzs.get(j))) | rzs.get(j).contains(asu.get(i)))、リストから削除されます。要素がまだ ASU にあり (M4 など)、カップル (M3M4) があるのはなぜですか? コードの構造について申し訳ありません。

4

1 に答える 1

2

コードでは明確ではありませんが、反復している ArrayList から要素を削除するときに、インデックスをインクリメントしたくない場合は、要素をスキップします。たとえば、次のようになります。

ArrayList<...> list = ...;

for (int i = 0; i < list.size(); ) {
   if (shouldBeRemoved)
       list.remove(i);
   else
       ++ i;
}

つまり、インデックス i の要素を削除すると、次の要素は i + 1 ではなく i になります。

要素をスキップしているため、チェックされているはずの一部がチェックされず、リストに残っていることがあります。

于 2013-08-06T09:09:12.707 に答える