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)?
对不起代码的结构。
答案 0 :(得分:2)
您的代码不太清楚,但是当您从正在迭代的ArrayList中删除元素时,您不希望增加索引,否则您将跳过元素,例如:
ArrayList<...> list = ...;
for (int i = 0; i < list.size(); ) {
if (shouldBeRemoved)
list.remove(i);
else
++ i;
}
换句话说,如果删除索引i处的元素,则下一个元素现在位于i,而不是i + 1.
由于您正在跳过元素,因此您可能会发现应该检查的某些元素没有,因此保留在列表中。