Java 解析arraylist中的相交值 公共类ID{ 公共字符串id; 公共长启动时间; 公共长期服务; } List existingIDS=new ArrayList(); List newIDSToWrite=new ArrayList();
我想将Java 解析arraylist中的相交值 公共类ID{ 公共字符串id; 公共长启动时间; 公共长期服务; } List existingIDS=new ArrayList(); List newIDSToWrite=new ArrayList();,java,algorithm,Java,Algorithm,我想将newIDSToWrite值与existingid值合并,如果发生冲突,则以newIDSToWrite值为准 existingIDS具有如下值(id1,4,7)(id2,10,14)(id3,16,21) newIDSToWrite具有如下值(id4,1,5)(id5,8,9)(id6,12,15)(id7,18,20) 如果上面的newIDSToWrite与existingIDS合并,结果应该是(id4,1,5)(id1,5,7)(id5,8,9)(id2,10,12)(id6,12,1
newIDSToWrite
值与existingid
值合并,如果发生冲突,则以newIDSToWrite
值为准
existingIDS
具有如下值(id1,4,7)(id2,10,14)(id3,16,21)
newIDSToWrite
具有如下值(id4,1,5)(id5,8,9)(id6,12,15)(id7,18,20)
如果上面的newIDSToWrite
与existingIDS
合并,结果应该是(id4,1,5)(id1,5,7)(id5,8,9)(id2,10,12)(id6,12,15)(id3,16,18)(id7,18,20)(id3,20,21)
执行此操作的最佳方法是什么?您可以使用方法
List.retainal()
:
链接到
更新:dasblinkenlight的评论很好:在类ID中,您应该重写
hash()
和equals()
方法,以实现正确的行为(使用相同值创建的两个ID应该相等,即使它们不指向堆中的相同对象)。您也可以使用apache commonsListUtils
existingIDS.retainAll(newIDSToWrite);
您可以找到文档
对于问题的第二部分,您可以使用与前面提出的问题相同的逻辑,但稍作修改
我建议这样做(注意,由于我写得很快,它可能无法直接编译)。此代码基本上使类更面向对象,并要求使用有效id初始化对象。如上所述,必须实现hashCode()和equals(),才能正确比较对象并检查对象是否包含在集合中(我通常让eclipse在选择字段时为我生成这些函数):
公共类ID{
私有字符串id;
私人长启动时间;
私人长时间;
公共id(字符串id){
if(id==null)抛出新异常(“RAII失败:IDS需要非null id”);
this.id=id;
}
//id-getter
//开始时间,结束时间-获取者/设置者
公共布尔等于(IDS otherId){
if(otherId==null)返回false;
返回otherId.getId().equals(getId());
}
}
List existingIDS=new ArrayList();
List newIDSToWrite=new ArrayList();
Set mergedIds=newhashset(newIDSToWrite);
用于(id:ExistingID){
如果(!mergedIds.contains(id))mergedIds.add(id);
}
Yes OP昨天也问了一个类似的问题。对接受答案的逻辑稍加修改即可达到目的。如果时间间隔重叠,retainAll不起作用。@vjk如果您想处理这种情况,您必须通过编写自己的“合并”方法“手动”处理它。
existingIDS.retainAll(newIDSToWrite);
ListUtils.union(existingIDS ,newIDSToWrite );
public class IDS {
private String id;
private long startTime;
private long endTime;
public IDS(String id){
if(id == null) throw new Exception("RAII failure: IDS requires non-null ID");
this.id = id;
}
// id - getter
// startTime, endTime - getters/setters
public boolean equals(IDS otherId){
if(otherId == null) return false;
return otherId.getId().equals(getId());
}
}
List<IDS> existingIDS = new ArrayList<IDS>();
List<IDS> newIDSToWrite = new ArrayList<IDS>();
Set<IDS> mergedIds = new HashSet<IDS>(newIDSToWrite);
for(IDS id : existingIDS){
if(!mergedIds.contains(id)) mergedIds.add(id);
}