[英]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);
使用散列,例如使用Set
或Map
如果要将对象作为一个整体进行比较:
equals
和hashcode
(如果尚未实现)A
所有元素放入一个Set
,然后查看列表B
中的哪些元素在该Set
如果您只想按某些属性比较对象:
List
)Map<KeyAttributeType, List<YourClass>>
并且对于列表A
每个元素,将元素添加到该Map
: map.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.