繁体   English   中英

使用一个循环进行 Arraylist 比较

[英]Arraylist Comparison using one loop

在开始编码和使用列表或数组列表时,我已经很久没有想到一些事情了。 当将一个数组的值与另一个数组中的所有其他元素进行比较时,我过去常常在两个 for 循环中进行,因为这是最简单的方法。但最近我开始知道它增加了很多时间复杂度,我想到了另一个解决方案。任何人都可以使用任何算法帮助我解决这个案例。 我正在使用 java.but 任何语言的解决方案都可以。 只需要算法来做到这一点。 提前致谢。

这就是我正在做的:

a1 = [1,2,3,4,5]
b1 = [9,5,4,3,8,3,7]

我想检查 a1 中的元素在 b1 中出现的时间

所以我正在做的是:

count = 0;

    for(int i = 0;i <a1.length;i++)
    {
      for(j=0;j<b1.length;j++)
       {
         if (a1[i] == b1[j])
          {
           count = count+1;
           }
         }
      }

    print("count is" count);

使用散列,例如使用SetMap

如果要将对象作为一个整体进行比较:

  • 为您的类正确实现equalshashcode (如果尚未实现)
  • 将列表A所有元素放入一个Set ,然后查看列表B中的哪些元素在该Set

如果您只想按某些属性比较对象:

  • 定义一个将对象映射到该属性的方法(或属性的组合,例如作为List
  • 创建一个Map<KeyAttributeType, List<YourClass>>并且对于列表A每个元素,将元素添加到该Mapmap.get(getKey(x)).add(x)
  • 对于列表B每个元素,计算键函数的值并从地图中获取它“匹配”的元素: matches = map.get(getKey(y))

不过,鉴于您的代码,您的情况似乎有些不同。 您有数字的列表或数组,因此不需要额外的散列,您不仅想查看哪些项目“匹配”,还想计算匹配项目的所有组合。 为此,您可以创建一个Map<Integer, Long>来计算第一个列表中每个元素出现的频率,然后获取第二个列表中元素的这些计数的总和。

int[] a1 = {1,2,3,4,5};
int[] b1 = {9,5,4,3,8,3,7};
Map<Integer, Long> counts = IntStream.of(b1).boxed()
        .collect(Collectors.groupingBy(x -> x, Collectors.counting()));
System.out.println(counts); // {3=2, 4=1, 5=1, 7=1, 8=1, 9=1}
long total = IntStream.of(a1).mapToLong(x -> counts.getOrDefault(x, 0L)).sum();
System.out.println(total);  // 4

当然,除了使用Stream API,您也可以使用常规循环。

不需要循环来获得你想要的

ArrayList<Integer> l1 = new ArrayList<Integer>();
    l1.add(1);
    l1.add(2);
    l1.add(3);
    l1.add(4);
    l1.add(5);
    ArrayList<Integer> l2 = new ArrayList<Integer>();
    l2.add(9);
    l2.add(5);
    l2.add(4);
    l2.add(3);
    l2.add(8);
    l2.add(3);
    l2.add(7);

    ArrayList<Integer> lFiltered = new ArrayList<Integer>(l2);
    lFiltered.removeAll(l1);

    int Times = l2.size() - lFiltered.size();
    System.out.println("number of migrants : " + Times);

足以从 l2 生成一个没有元素和 l1 的列表并计算已删除的元素

使用数组列表。 比较两个数组的内容:

ArrayList<String> listOne = new ArrayList<>(Arrays.asList(yourArray1);

        ArrayList<String> listTwo = new ArrayList<>(Arrays.asList(yourArray);

        listOne.retainAll(listTwo);

        System.out.println(listOne)

查找缺失元素:

    listTwo.removeAll(listOne);

    System.out.println(listTwo);

要枚举 Common 元素:

//Time complexity is O(n^2)

    int count =0;
    for (String element : listOne){
      for (String element2: listTwo){
       if (element.equalsIgnoreCase(elemnt2){
     count += 1;
    }
    }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM