1

第二个问题,这是第一个问题的继续。我有两个字符串列表。有一个字符串列表 (asu) - M1, M2, M3 ... 以及一个字符串列表 (rzs) - M1, M2, M3 及其所有可能的组合。需要为每个元素(asu)(例如M1)在(rzs)中找到一个元素(M1,M1M2,..),其中包含(例如M1)。示例:从 (asu) 获取 M1 并将开始在 (rzs) 中搜索重复项(包含)。我们在 (rzs) 中找到了 M1M2,它包含 M1。之后,我们应该从列表中删除这两个元素。非常感谢 No Idea For Name 帮助修改了此代码。但是程序总是因为 AbstractList.remove 错误而失败。请帮助实现逻辑和调整代码!

Imports..........
        public class work{
        List<string> asu = Arrays.asList("M1","M1","M1","M3","M4","M5","M1","M1","M1","M4","M5","M5");
        List<string> rzs = Arrays.asList("M1","M2","M3","M4","M5",
        "M1M2","M1M3","M1M4","M1M5","M2M3","M2M4","M2M5","M3M4","M3M5","M4M5"
        ,"M1M2M3","M1M2M4","M1M2M5","M1M3M4","M1M3M4","M1M4M5","M2M4","M2M5");

        public static void main(String[] args) {
        work bebebe = new work();
        bebebe.mywork();
        }

        List<string> tmp1 = new ArrayList<string>();  
        List<string> tmp2 = new ArrayList<string>();  
           System.out.println(Arrays.deepToString(rzs));
           System.out.println(Arrays.deepToString(asu));
           for (string curr : asu){
             for (string currRzs : rzs){
               System.out.println("New iteration ");
               if (currRzs.contains(curr)) {
                  System.out.println("Element ("+curr+") in ASU =
                                    element ("+currRzs+") in RZS");
                  if(tmp1.contains(curr) == false)
                     tmp1.add(curr);

                  if(tmp2.contains(currRzs) == false)
                     tmp2.add(currRzs);
               }
              } 
            }

           for (string curr : tmp1){
              asu.remove(curr);
           }

           for (string currRzs : tmp2){
              rzs.remove(currRzs);
           }
4

5 回答 5

2

不要使用 foreach 循环从列表中删除项目。使用经典的 for 和迭代元素,当删除项目时,减少迭代器。

于 2013-08-05T10:49:51.163 回答
2

要在迭代时安全地删除元素,请使用 Iterator.remove 方法:

如果在迭代过程中以除调用此方法之外的任何方式修改了基础集合,则迭代器的行为是未指定的。

Iterator<String> i = tmp1.iterator();
while (i.hasNext()) {
   i.next(); // must be called before remove
   i.remove();
}

此外,只需调用以下命令即可更轻松地从另一个集合中删除所有集合:

asu.removeAll(tmp1);
于 2013-08-05T10:50:43.057 回答
2

您应该尝试使用 Collection 的 removeAll() 或 retainAll() 方法。

例如:

List<String> aList = new ArrayList<String>();
aList.add("a");
aList.add("b");
aList.add("c");
aList.add("d");
aList.add("e");

List<String> bList = new ArrayList<String>();
bList.add("b");
bList.add("e");
bList.add("d");

aList.removeAll(bList);

将为您提供 aList 中剩余的“a”和“c”元素

如果您尝试使用 retainAll() 方法:

aList.retainAll(bList);

将为您提供 aList 中剩余的“b”、“d”和“e”元素;

retainAll()用于删除调用集合中不属于给定集合的所有元素。

removeAll()用于从另一个集合中删除一个集合的所有元素。

因此,这完全取决于您的用例。

编辑

如果在任何情况下您想在有条件地迭代时从这些集合中删除一些元素,那么您应该首先获取Iterator<Type>then 调用remove()它的方法。

像:

while(iterator.hasNext()){
    String str = iterator.next();

    if(str.equals('test')){
        iterator.remove();
    }
}
于 2013-08-05T10:57:49.550 回答
2

您可以使用removeAll()方法从列表中删除元素集合,而不是一一删除。
采用

asu.removeAll(tmp1);

代替

for (string curr : tmp1)
{
    asu.remove(curr);
}

并使用

rzs.removeAll(tmp2);  

代替

for (string currRzs : tmp2)
{
     rzs.remove(currRzs);
}

更新
我找出你的问题。问题在于Arrays.asList()方法。
根据Arrays#asList

asList() 返回“由指定数组支持的固定大小的列表”。如果要调整数组大小,则必须创建一个新数组并复制旧数据。然后该列表将不会由相同的数组实例支持。

所以为列表创建一个重复的 ArrayList。像这样

 List<string> asuDuplicat = new ArrayList<string>(asu);  
 List<string> rzsDuplicat = new ArrayList<string>(rzs);  

使用asuDuplicat, rzsDuplicat.

 asuDuplicat.removeAll(tmp1);
 rzsDuplicat.removeAll(tmp2);
于 2013-08-05T11:01:08.470 回答
2

您可以使用 Set 而不是 List,它会自动删除重复的元素...

于 2013-08-05T11:07:20.450 回答