Java 在一个for循环中合并间隔

Java 在一个for循环中合并间隔,java,algorithm,arraylist,merge,array-merge,Java,Algorithm,Arraylist,Merge,Array Merge,这可能是一个奇怪的问题,但我正在尝试合并间隔时间,只是担心for循环外有一行-,我真的想将这行(哈哈)合并到for循环中,让所有事情都立即发生 问题:例如,假设给定了间隔(1,5)、(3,7)、(4,6)、(6,8)、(10,12)、(12,15),程序应该返回(1,8)、(10,15),因为这些间隔合并了所有重叠的间隔 我的方法是,我有一个当前值和第一对的值,然后从1到结尾运行一个for循环,检查我所在的对是否与当前值合并。如果它确实合并了,我会更新当前对中的值,如果它没有合并,我会将当前添加

这可能是一个奇怪的问题,但我正在尝试合并间隔时间,只是担心for循环外有一行-,我真的想将这行(哈哈)合并到for循环中,让所有事情都立即发生

问题:例如,假设给定了间隔(1,5)、(3,7)、(4,6)、(6,8)、(10,12)、(12,15),程序应该返回(1,8)、(10,15),因为这些间隔合并了所有重叠的间隔

我的方法是,我有一个当前值和第一对的值,然后从1到结尾运行一个for循环,检查我所在的对是否与当前值合并。如果它确实合并了,我会更新当前对中的值,如果它没有合并,我会将当前添加到结果列表中,然后将其值更新到我当前所在的任何节点上

尽管有必要,您也可以随意更改代码,使其在一个for循环中工作。 如果您看到代码中有任何其他错误,请告诉我。谢谢大家!

class Pair{
    public int first;
    public int second;
    
    public Pair(int x, int y){
      this.first = x;
      this.second = y; 
    }
}

class MergeIntervals{
  static ArrayList<Pair> mergeIntervals(ArrayList<Pair> v) {
  ArrayList<Pair> result = new ArrayList<Pair>();
 
  //check for size & null
  if(v == null || v.size() == 0) {
    return null;
  } 
  if(v.size() == 0) {
    result.add(v.get(0));
    return result;
  }

  Pair current = new Pair(v.get(0).first, v.get(0).second);

  for(int i = 1; i < v.size(); i++) {

    //want to merge
    if(v.get(i).first < current.second) {
      if(v.get(i).second > current.second) {
        current.second = v.get(i).second;
      }
    }
    else {
      result.add(new Pair(current.first, current.second));
      current.first = v.get(i).first;
      current.second = v.get(i).second;
    }
  }
  //loop broke before was able to merge
  result.add(new Pair(current.first, current.second));

  return result;
  }
}
类对{
公共int优先;
第二次公开辩论;
公共对(整数x,整数y){
第一个=x;
这个秒=y;
}
}
类合并间隔{
静态ArrayList合并间隔(ArrayList v){
ArrayList结果=新建ArrayList();
//检查大小(&null)
如果(v==null | | v.size()==0){
返回null;
} 
如果(v.size()==0){
结果。添加(v.get(0));
返回结果;
}
对电流=新对(v.get(0)。第一,v.get(0)。第二);
对于(int i=1;icurrent.second){
current.second=v.get(i).second;
}
}
否则{
结果.添加(新对(当前.第一,当前.第二));
current.first=v.get(i).first;
current.second=v.get(i).second;
}
}
//循环在能够合并之前中断
结果.添加(新对(当前.第一,当前.第二));
返回结果;
}
}

总结现有代码可能的更改/增强:

  • 在类
    Pair
    中,为方便起见,提供一个复制构造函数并重写
    toString()
  • 增强
    merge
    方法中输入数据的验证
  • 对输入数据进行排序,以保证间隔的顺序
  • merge
    方法中使用
    Pair
    复制构造函数
类对{
公共int优先;
第二次公开辩论;
公共对(整数x,整数y){
第一个=x;
这个秒=y;
}
公共对(p对){
这(第一页,第二页);
}
@凌驾
公共字符串toString(){
返回“(“+first+”、“+second+”)”;
}
}
类合并间隔{
公共静态列表合并(列表v){
如果(null==v){
返回null;
}
//提前返回一个空列表或包含一对
如果(v.size()<1){
返回v;
}
列表结果=新建ArrayList();
Collections.sort(v,(a,b)->Integer.compare(a.first,b.first));
对电流=新对(v.get(0));
对于(int i=1;iif(p.first紧跟在want to merge注释之后,它可能也是,if size==1,您添加元素0,而不是if size==0,它可以在if之前的if中被v.isEmpty()替换。最后,您可以在末尾添加current,因为它不再被修改。如果您希望它出现在循环中,我不建议您添加if(i==v.size()-1)并将其放在循环的末尾,但您也可以在if中添加最后一个元素后中断,并从for中删除i(v.get(i.first
时,您应该扩展两端:
current.first=Math.min(current.first,v.get(i.first);current.second=Math.max(current.second,v.get(i.second);
[(1, 8), (10, 15)]