java—从现有数据集中删除数字并创建新的数据集

yzckvree  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(377)

我有一份范围清单。现在我将得到一个数字列表&我必须从范围中删除数字并创建新的范围。
所有的连续数应该在一个范围内,不连续数应该在单独的范围内。

public class DriverClass{
  public static void main(String[] args){
     List<Interval> intervals = new ArrayList<Interval>();
     Interval i1 = new Interval(5, 9);
     Interval i2 = new Interval(12, 23);
     intervals.add(i1);
     intervals.add(i2);

     List<Integer> numbersToBeDeleted = Arrays.asList(6, 7, 19, 21);
  }
}

删除6,7,19,21
预期输出:[5,5],[8,9],[12,18],[20,20],[22,23]

class Interval {
    int start, end;

    Interval(int start, int end) {
        this.start = start;
        this.end = end;
    }
}

我无法思考解决方案,任何建议都会有帮助!

kyxcudwk

kyxcudwk1#

我处理过以下用例:
如果现有间隔的开始和结束与现有间隔相同,则从列表中删除该间隔。
如果要删除的间隔位于现有范围之间,那么我将现有间隔划分为2个间隔,不包括要删除的间隔&在列表中添加2个新间隔。
如果要删除的间隔位于现有间隔的边界值中,则我不会创建新的开始/结束间隔。
示例代码:

public void  deleteIntervals(){

        List<Interval> intervals = new ArrayList<Interval>();
        Interval i1 = new Interval(2, 9);
        Interval i2 = new Interval(12, 27);
        Interval i3 = new Interval(29, 500);
        intervals.add(i1);
        intervals.add(i2);
        intervals.add(i3);

        List<Interval> deleteIntervals = new ArrayList<Interval>();
        Interval d1 = new Interval(2, 7);
        Interval d2 = new Interval(13, 15);
        Interval d3 = new Interval(18, 20);
        Interval d4 = new Interval(22, 22);
        Interval d5 = new Interval(50, 500);
        Interval d6 = new Interval(22, 22);
        deleteIntervals.add(d1);
        deleteIntervals.add(d2);
        deleteIntervals.add(d3);
        deleteIntervals.add(d4);
        deleteIntervals.add(d5);
        deleteIntervals.add(d6);

        List<Interval> finalDelete = new ArrayList<Interval>();

        for (int i = 0; i < deleteIntervals.size(); i++) {
            for (int j = 0; j < intervals.size(); j++) {
                System.out.println(
                        "Range to delete: " + deleteIntervals.get(i).start + ", " + deleteIntervals.get(i).end);
                intervals.stream().forEach(ele -> System.out.print("[" + ele.start + ", " + ele.end + "]" + ", "));
                System.out.println();

                if (deleteIntervals.get(i).start == intervals.get(j).start
                        && deleteIntervals.get(i).end == intervals.get(j).end) {
                    intervals.remove(j);
                    break;

                }

                else if (deleteIntervals.get(i).start >= intervals.get(j).start
                        && deleteIntervals.get(i).end <= intervals.get(j).end) {
                    System.out.println("Matched: [" + intervals.get(j).start + ", " + intervals.get(j).end + "]");

                    int newStart = (deleteIntervals.get(i).start - intervals.get(j).start);
                    int newEnd = intervals.get(j).end - (deleteIntervals.get(i).end);

                    if (newStart > 0) {

                        System.out.println("Adding 1: " + "[" + intervals.get(j).start + ","
                                + (intervals.get(j).start + newStart - 1) + "]");
                        finalDelete.add(new Interval(intervals.get(j).start, (intervals.get(j).start + newStart - 1)));

                        intervals.add(new Interval(intervals.get(j).start, (intervals.get(j).start + newStart - 1)));

                    }
                    if (newEnd > 0) {

                        System.out.println("Adding 2:" + "[" + (intervals.get(j).end - newEnd + 1) + ","
                                + intervals.get(j).end + "]");
                        finalDelete.add(new Interval((intervals.get(j).end - newEnd + 1), intervals.get(j).end));

                        intervals.add(new Interval((intervals.get(j).end - newEnd + 1), intervals.get(j).end));

                    }
                    intervals.remove(j);
                    break;

                }
            }

        }

        intervals.stream().forEach(ele -> System.out.print("[" + ele.start + ", " + ele.end + "]" + ", "));

}
oxalkeyp

oxalkeyp2#

对于要删除的每个号码:
找到包含该数字的区间索引(如果有的话;如果没有这样的间隔,你就完了,可以考虑扔了)。
依靠:
如果要删除的数字是间隔中的唯一数字,则删除整个间隔。
否则,如果数字是间隔中的第一个或最后一个,则缩短间隔。
否则分成两段。
您可能希望以不同的方式编写条件检查代码,但这应该是基本思想。用于在列表中删除和插入间隔 List.remove(int) 以及 List.add(int, E) 方法应该是有用的。快乐的编码。
ps向您的应用程序添加方法可能会很方便 Interval 类来确定是否包含一个数字,它是第一个还是最后一个,并缩短前面或后面的间隔。甚至可能是一种分裂成两个区间的方法。

相关问题