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 commons
ListUtils

existingIDS.retainAll(newIDSToWrite);
您可以找到文档

对于问题的第二部分,您可以使用与前面提出的问题相同的逻辑,但稍作修改

  • (1,3)(2,4)(5,6)
  • curmax=-inf
  • curmax=3
  • 2<3-将第一个和第二个标记为“坏”。curmax=4
  • 将值2更新为(3+1)
  • 5>4-什么都不做。curmax=6
  • (5,6)-是唯一好的部分

  • 我建议这样做(注意,由于我写得很快,它可能无法直接编译)。此代码基本上使类更面向对象,并要求使用有效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);
    }