【问题标题】:Arraylist Comparison using one loop使用一个循环的 Arraylist 比较
【发布时间】:2019-11-28 13:23:05
【问题描述】:

在开始编码和使用列表或数组列表时,我已经很久没有想到什么了。在将一个数组的值与另一个数组中的所有其他元素进行比较时,我曾经在两个 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);

【问题讨论】:

  • 使用hashing,例如带有SetMap
  • 定义“比较”的含义。发布您编写的方法,并解释它应该做什么。给出示例输入和输出。
  • 谁能提到在一个数组中执行此过程的任何算法
  • 如果你想提高内存效率:排序并比较。

标签: java algorithm loops for-loop data-structures


【解决方案1】:

不需要循环就可以得到你想要的

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 的列表并计算已删除的元素就足够了

【讨论】:

    【解决方案2】:

    使用hashing,例如使用SetMap

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

    • 为您的班级正确实施equals and hashcode(如果尚未实施)
    • 将列表A的所有元素放入一个Set,然后查看列表B中的哪些元素在那个Set

    如果你只是想通过某个属性来比较对象:

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

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

    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,您也可以使用常规循环。

    【讨论】:

      【解决方案3】:

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

      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);
      

      枚举通用元素:

      //Time complexity is O(n^2)
      
          int count =0;
          for (String element : listOne){
            for (String element2: listTwo){
             if (element.equalsIgnoreCase(elemnt2){
           count += 1;
          }
          }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-03
        • 1970-01-01
        • 2017-07-01
        • 2021-12-13
        • 2015-05-19
        相关资源
        最近更新 更多