【问题标题】:Removing Common Values from Two Array Lists从两个数组列表中删除公共值
【发布时间】:2016-12-22 08:50:48
【问题描述】:

我有两个数组列表。第一个数组列表包含应从第二个数组列表中删除的 ID。第二个数组列表不仅包含 ID,还包含其他信息(制表符分隔)。

ArrayList1 = [1000, 1001]
ArrayList2 = [1000     Yes     3     33,1001     No     No     22,1002     No     Yes     4,1003     No     No     13]

我想做的是删除 ArrayList2 中具有相同 ID 的所有元素。因此,最终输出应该是另一个数组列表,如下所示: ArrayList2= [1002 否 是 4,1003 否 否 13].

关于如何解决这个问题的任何想法。

【问题讨论】:

  • 循环第二个数组列表。对于每个元素额外的字符串中的 id。然后检查id是否在第一个arraylist中。如果是这样,请从第二个数组列表中删除条目。多田。
  • 这似乎是使用一些基本 OOP 原则并将所有这些联合信息块包装到对象中的好时机。

标签: java list arraylist collections iterator


【解决方案1】:

如果每个元素的前四位数字是您要检查的整数,则遍历列表并使用字符“”(空格)使用正则表达式拆分每个元素。

现在您有了由Object 组成的列表元素,您可以确定第一个条目是一个整数。只需检查整数即可。

在伪代码中:

for (Object obj : ArrayList1) {
  String[] result = Regex.split (obj, " ");
  if (result [0] == myIdToCheck) 
     ArrayList2.remove (obj);
}

【讨论】:

    【解决方案2】:

    你可以试试下面的代码。

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Iterator;
    
    public class Test {
        public static void main(String args[]){
            Integer idArr[] =  {1000, 1001};
            String unitArr2[] = {"1000  Yes 3   33","1001   No  No  22","1002   No  Yes 4","1003    No  No  13"};
    
            ArrayList<String> list = new ArrayList<String>(Arrays.asList(unitArr2));
    
            for(int id: idArr){
                Iterator<String> iterator = list.iterator();
                while(iterator.hasNext()){
                    String unit = iterator.next();
                    if(Integer.parseInt(unit.split("\t")[0]) == id){
                        iterator.remove();
                        break;
                    }
                }
            }
    
            for(String unit: list){
                System.out.println(unit);
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      当您想要迭代并删除元素时,请使用 ListIterator。以下代码应删除常用值

          ListIterator<String> iter = list2.listIterator();
          while(iter.hasNext()){
              String value = iter.next();
              String [] tokens = value.split("\\s+");
              if(list1.contains(tokens[0].trim())){
                  iter.remove();
              }
          }
      

      使用流

      List<String> filtered = list2.stream()
                  .filter(x -> {
                      String [] tokens = x.split("\\s+");
                      if(list1.contains(tokens[0].trim())){return false;
                      }else{return true;}
                  }).collect(Collectors.toList());
      

      【讨论】:

        【解决方案4】:

        如果你使用的是 Java 8,你可以filter 一个stream:

        import java.util.*;
        import java.util.stream.*;
        
        public class Quick {
            private static boolean filter(List<Integer> list, String s) {
                boolean result = false;
        
                // TODO: improve error checking
                String[] tokens = s.split("\t");
        
                if (tokens.length > 0) {
                    int i = Integer.parseInt(tokens[0]);
                    result = ! list.contains(i); 
                }
        
                return result;
            }
        
            public static void main(String[] args) {
                // setup
        
                List<Integer> list1 = new ArrayList<>();
                list1.add(1000);
                list1.add(1001);
        
                List<String> list2 = new ArrayList<>();
                list2.add("1000\tYes\t3\t33");
                list2.add("1001\tNo\tNo\t22");
                list2.add("1002\tNo\tYes\t4");
                list2.add("1003\tNo\tNo\t13");
        
                // generate 'result' list
                List<String> result = list2.stream()
                                         .filter(s -> filter(list1,s))
                                         .collect(Collectors.toList());
        
                // print 'result' list
                for (String s : result) { System.out.println("TRACER " + s); }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-04
          • 1970-01-01
          相关资源
          最近更新 更多