Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中数组的比较_Java_Arrays_Algorithm - Fatal编程技术网

Java中数组的比较

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

我有两个整数数组,一个是原始数组,另一个是修改的w.r.t原始数组。 可以从原始图元中添加或删除图元,以将其转换为修改后的图元。我的问题是,在修改后的数组中,我需要找出哪些元素是新的,哪些元素是相同的,哪些元素不在原始数组中

给定数据:

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