Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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_Algorithm_Arraylist_Data Structures_Set - Fatal编程技术网

Java 比较两个数组列表以保留它们之间的增量的有效方法

Java 比较两个数组列表以保留它们之间的增量的有效方法,java,algorithm,arraylist,data-structures,set,Java,Algorithm,Arraylist,Data Structures,Set,我的问题是: 我需要比较两个ArrayList,如果它们相同或不同,则返回其中一个的新元素,可以说是pivot 以下是数据集的行为: 这两个ArrayList由字符串组成 它们来自同一个来源,所以大多数时候都是相同的 是有序的(在附加到它们的自定义逻辑的意义上) 永远不会有任何空字符串 所有字符串的长度始终相同 没有重复的 我想要的是: 以最快的方式实现我的两个目标,无论哪种情况 仅使用Java1.6标准库特性,我不希望实现一个混合类,它模拟列表中的内容,然后设置为示例 例如: A: [

我的问题是:

我需要比较两个ArrayList,如果它们相同或不同,则返回其中一个的新元素,可以说是pivot

以下是数据集的行为:

  • 这两个ArrayList由字符串组成
  • 它们来自同一个来源,所以大多数时候都是相同的
  • 是有序的(在附加到它们的自定义逻辑的意义上)
  • 永远不会有任何空字符串
  • 所有字符串的长度始终相同
  • 没有重复的
我想要的是:

  • 以最快的方式实现我的两个目标,无论哪种情况
  • 仅使用Java1.6标准库特性,我不希望实现一个混合类,它模拟列表中的内容,然后设置为示例
例如:

A: [ 'a', 'b', 'c', 'd']   

B: [ 'a', 'c', 'd']
结果:列表不同,返回元素“b”;A将是“工作”列表,我们将根据此ArrayList中的新内容进行比较,因为B永远不会改变


感谢您的任何回复和您的输入。

您最快的可能要求困扰了我很多——我反对优化——我通常认为早期优化是最坏的编程实践之一。

如果你真的想这样做,只需按顺序浏览两个列表

如果第一个条目匹配,则将该条目放入“相同”的堆中,并增加两个索引。如果它们不同,则将第一个(低于/低于)放在“不同”的堆中,并递增列出索引。以这种方式循环,直到到达一个列表的末尾(另一个列表中的任何剩余部分都会进入“不同”集合)

这应该会让你“接近”最快的方式。如果你想要绝对最快的方式,那么你必须从使用数组开始,而不是列表,然后在这个方式的每一步都要注意你做的其他事情——但是算法应该仍然非常接近最优

作为次优但可读性更高的示例,您可以使用一些集合操作

Set set1=new HashSet(list1)
Set set2=new HashSet(list2)
Set same=set1.retainAll(set2) // I forget if retainAll modifies set1--if so you need to copy it first
set1.removeAll(list2)
set2.removeAll(list1)
Set different=set1.addAll(set2)

// at this point same contains all the similar values and different contains the ones that don't match.  Done.

这是一个简短易读的代码,可能比你想象的性能更好。如果这样的代码足够好的话(比如,在速度不太重要的GUI代码中),那么编写自己的代码是不好的做法

您最快的可能要求困扰了我很多——我反对优化——我通常认为早期优化是最坏的编程实践之一。

如果你真的想这样做,只需按顺序浏览两个列表

如果第一个条目匹配,则将该条目放入“相同”堆并递增两个索引。如果它们不同,则将第一个(小于或等于)条目放入“不同”堆并递增该列表索引。以这种方式循环,直到到达一个列表的末尾(另一个列表中的任何剩余项显然进入“不同”集合)

这应该会让你“接近”最快的方式。如果你想要绝对最快的方式,那么你必须从使用数组开始,而不是列表,然后在这个方式的每一步都要注意你做的其他事情——但是算法应该仍然非常接近最优

作为次优但可读性更高的示例,您可以使用一些集合操作

Set set1=new HashSet(list1)
Set set2=new HashSet(list2)
Set same=set1.retainAll(set2) // I forget if retainAll modifies set1--if so you need to copy it first
set1.removeAll(list2)
set2.removeAll(list1)
Set different=set1.addAll(set2)

// at this point same contains all the similar values and different contains the ones that don't match.  Done.
这很短,可读性好,而且可能比您想象的要高。如果这样做效果足够好(比如,在速度不太重要的GUI代码中),那么编写自己的代码是不好的做法。

非常简单(假设列表按升序排列,可以很容易地按降序排列):

ArrayList delta(ArrayList a、ArrayList b、Comparator comp){
如果(a.isEmpty())
返回新的ArrayList(b);
if(b.isEmpty())
返回新的ArrayList(a);
迭代器it_a=a.迭代器();
迭代器it_b=b.迭代器();
ArrayList delta=新的ArrayList();
字符串a_s=it_a.next(),b_s=it_b.next();
布尔值onechecked=false;
而(!onechecked){
int comp_v=comp.comp(a_s,b_s);
if(comp_v==0){
//字符串是相等的->将它们分开
if(it_a.hasNext())
a_s=it_a.next();
其他的
onechecked=true;
if(it_b.hasNext())
b_s=it_b.next();
其他的
onechecked=true;
}否则如果(补偿v<0){
//a_s不是b的一部分
delta.add(a_s);
if(it_a.hasNext())
a_s=it_a.next();
其他的
onechecked=true;
}否则{
//b_s不是a的一部分
delta.add(b_s);
if(it_b.hasNext())
b_s=it_b.next();
其他的
onechecked=true;
}
}
//添加剩余项目
delta.add(it_a.hasNext()?a_s:b_s);
for(迭代器it=(it_a.hasNext()?it_a:it_b);it.hasNext();)
delta.add(it.next());
返回三角洲;
}
很抱歉,没有添加任何解释,但代码必须说明它自己,因为我不知道如何解释它。

非常简单(假设列表按升序排列,可以很容易地按降序排列):

ArrayList delta(ArrayList a、ArrayList b、Comparator comp){
如果(a.isEmpty())
返回新的ArrayList(b);
if(b.isEmpty())
返回新的ArrayList(a);
迭代器it_a=a.迭代器();
迭代器it_b=b.迭代器();
ArrayList delta=新的ArrayList();
字符串a_s=it_a.next(),b_s=it_b.next();
布尔值onechecked=false;
而(!onechecked){
int comp_v=comp.comp(a_s,b_s);
if(comp_v==0){
//字符串是相等的->将它们分开
if(it_a.hasNext())
a_s=it_a.next();
其他的
onechecked=true;
if(it_b.hasNext())
b_s=it_b.next();
其他的
onechecked=true;
}否则如果(公司)