检查代码。不明白为什么逻辑不能完全发挥作用

时间:2013-08-06 08:59:55

标签: java

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)? 对不起代码的结构。

1 个答案:

答案 0 :(得分:2)

您的代码不太清楚,但是当您从正在迭代的ArrayList中删除元素时,您不希望增加索引,否则您将跳过元素,例如:

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

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

换句话说,如果删除索引i处的元素,则下一个元素现在位于i,而不是i + 1.

由于您正在跳过元素,因此您可能会发现应该检查的某些元素没有,因此保留在列表中。