Java中数组的比较
我有两个整数数组,一个是原始数组,另一个是修改的w.r.t原始数组。 可以从原始图元中添加或删除图元,以将其转换为修改后的图元。我的问题是,在修改后的数组中,我需要找出哪些元素是新的,哪些元素是相同的,哪些元素不在原始数组中 给定数据:Java中数组的比较,java,arrays,algorithm,Java,Arrays,Algorithm,我有两个整数数组,一个是原始数组,另一个是修改的w.r.t原始数组。 可以从原始图元中添加或删除图元,以将其转换为修改后的图元。我的问题是,在修改后的数组中,我需要找出哪些元素是新的,哪些元素是相同的,哪些元素不在原始数组中 给定数据: arr1 = 3,2,1 //Original array arr2 = 1,4,5 //Modified array by adding and/or removing elements 我需要像这样的东西: same = 1 remov
arr1 = 3,2,1 //Original array
arr2 = 1,4,5 //Modified array by adding and/or removing elements
我需要像这样的东西:
same = 1
removed = 2,3
added = 4,5
显然,我可以编写几个嵌套for循环并找到它,但这样做效率太低。我想知道是否有更好或更有效的方法。。
我正在使用Java。
解决类似的问题,但不确定我是否能用它来解决我的问题
任何帮助都将不胜感激。如果内存不是一个约束条件,我建议对此类操作使用
Set
。找到您需要的东西只需在两个Set
对象上调用适当的方法。当然,这假设您的元素中有唯一的元素,如果没有,那么在报告内容时,您只对唯一的元素感兴趣。例如
public static void testSet() {
final Set<Integer> first = new HashSet<Integer>(Arrays.asList(1, 2, 3));
final Set<Integer> second = new HashSet<Integer>(Arrays.asList(1, 4, 5));
Set<Integer> result = new HashSet<Integer>(first);
result.retainAll(second);
System.out.println("Similar: " + result);
result = new HashSet<Integer>(first);
result.removeAll(second);
System.out.println("Removed: " + result);
result = new HashSet<Integer>(second);
result.removeAll(first);
System.out.println("Newly added: " + result);
}
/*
OUTPUT:
Similar: [1]
Removed: [2, 3]
Newly added: [4, 5]
*/
publicstaticvoidtestset(){
final Set first=新的HashSet(Arrays.asList(1,2,3));
final Set second=新的HashSet(Arrays.asList(1,4,5));
设置结果=新哈希集(第一);
结果:保留(秒);
System.out.println(“类似:+结果);
结果=新哈希集(第一);
结果:移除所有(第二);
System.out.println(“删除:+结果”);
结果=新哈希集(秒);
结果:移除所有(第一);
System.out.println(“新增:+结果”);
}
/*
输出:
类似:[1]
删除:[2,3]
新增:[4,5]
*/
您正在尝试计算两个阵列之间的距离
有一个简单的动态规划解决方案可以计算(摘自维基百科):
您可以很容易地更改此代码来告诉您各个操作是什么。您可以对每个数组进行一次检查,显然可以使用删除-保存迭代,就像从数组后面循环一样
int[] same
for (int i = arr1.length; i >= 0; i--)
{
if(arr2.contains(i))
same.add(i)
arr1.remove(i)
}
for (int i = arr2.length; i >= 0; i--)
{
if(same.contains(i))
arr2.remove(i)
}
然后
arr1
将被删除,将添加arr2
,并且same
将是相同的。如果没有重复项,并且限制了最大整数,并且成员的密度适中(例如,密度为1%或更高),则将其放入位集。两组中的“和”是“相同的”,A和NOT(B)仅为A中的,B和NOT(A)仅为B中的。如果整数是中等密度的,这是非常快的
如果整数是稀疏的,则对每个数组进行排序,并依次向上遍历。整数是否保证有序?数组中是否存在重复项?整数有上界吗?对不起,我应该提到的。不,订单不能保证。。我会把这篇文章编辑清楚。
1,2,3
和3,2,1
一样吗?你在说什么方法?我从来没有听说过一个Java库方法可以进行这种比较。removeAll和Retainal是完成这项工作的方法。用示例代码段更新了文章。这是一个简单的解决方案。谢谢,我也在看下面的动态规划解决方案。是的,这是“空间复杂性”方面的简单解决方案。包含
检查这里是O(n)
仅供参考,这正是集合
解决方案试图解决的问题。@Sanjay同意,这不是最好的,但很简单。如果这看起来像是吹毛求疵,很抱歉,但这到底有多简单?这段代码大约有12行,用于查找相同的内容和其他内容。在大约16行中,我有所有的3件事和示例代码!另外,使用这个解决方案也没关系,在内存不受限制的情况下,OP在处理“大型”集合时必须记住Set
解决方案。当然,YMMV:)
int[] same
for (int i = arr1.length; i >= 0; i--)
{
if(arr2.contains(i))
same.add(i)
arr1.remove(i)
}
for (int i = arr2.length; i >= 0; i--)
{
if(same.contains(i))
arr2.remove(i)
}