Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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 删除Int的ArrayList中的连续值_Java_Arraylist - Fatal编程技术网

Java 删除Int的ArrayList中的连续值

Java 删除Int的ArrayList中的连续值,java,arraylist,Java,Arraylist,我创建了一个大约有30000个值的ArrayList,排序后,我有很多连续的值,例如: 22001 22002 22003 22004 22010 22011 22020 ArrayList<Long> l = new ArrayList<Long>(); // with my values Collections.sort(l); ArrayList<Long> liste = new ArrayList<Long>(); 我想要:22001

我创建了一个大约有30000个值的ArrayList,排序后,我有很多连续的值,例如:

22001 22002 22003 22004 22010 22011 22020

ArrayList<Long> l = new ArrayList<Long>(); // with my values
Collections.sort(l);
ArrayList<Long> liste = new ArrayList<Long>();
我想要:22001 22004 22010 22011 22020

ArrayList<Long> l = new ArrayList<Long>(); // with my values
Collections.sort(l);
ArrayList<Long> liste = new ArrayList<Long>();

我没有测试它,但它应该适用于包含3个或更多元素的列表。它在内存使用方面没有得到优化

ArrayList<Long> resultList= new ArrayList<Long>();
Long prevNumber= l.get(0);
for (int i = 1; i < l.size() - 1; i++) {
    if (prevNumber.equals(l.get(i) - 1) && l.get(i + 1).equals(l.get(i) + 1)) {
        //print 'inbetween' consecutive number
    } else {
        //not a consecutive, copy it to result list
        resultList.add(l.get(i));
    }
    prevNumber= l.get(i);
} 

我没有测试它,但它应该适用于包含3个或更多元素的列表。它在内存使用方面没有得到优化

ArrayList<Long> resultList= new ArrayList<Long>();
Long prevNumber= l.get(0);
for (int i = 1; i < l.size() - 1; i++) {
    if (prevNumber.equals(l.get(i) - 1) && l.get(i + 1).equals(l.get(i) + 1)) {
        //print 'inbetween' consecutive number
    } else {
        //not a consecutive, copy it to result list
        resultList.add(l.get(i));
    }
    prevNumber= l.get(i);
} 

解决此问题的简单代码示例如下:

    int[] data =new int[] {22001, 22002, 22003, 22004,22005, 22010, 22011, 22020};

    System.out.println(data[0]); //The first element

    for(int current = 1; current < data.length-1; current++) {
        if(data[current+1] - data[current-1] != 2) {
            System.out.println(data[current]);
        }
    }

    System.out.println(data[data.length-1]);//The last element
评论

这是怎么回事

我们不必检查下一项是否大于一项。我们更感兴趣的是,下一步之后做的项目与当前项目的距离为2


换句话说,如果左邻居小1,右邻居大1,则排除该元素

解决此问题的简单代码示例:

    int[] data =new int[] {22001, 22002, 22003, 22004,22005, 22010, 22011, 22020};

    System.out.println(data[0]); //The first element

    for(int current = 1; current < data.length-1; current++) {
        if(data[current+1] - data[current-1] != 2) {
            System.out.println(data[current]);
        }
    }

    System.out.println(data[data.length-1]);//The last element
评论

这是怎么回事

我们不必检查下一项是否大于一项。我们更感兴趣的是,下一步之后做的项目与当前项目的距离为2


换句话说,如果左邻居小1,右邻居大1,则排除该元素

我相信这个问题可以大大简化为:

循环遍历列表,当当前数字不是前一个数字+1时,将当前值和前一个值添加到结果集中

这意味着,不要考虑为连续范围添加开始和结束,而是考虑在遇到间隙时添加两侧

psuedo代码:

Set<Integer> resultSet = new LinkedHashSet<Integer>();

Integer prev = null;

for (Integer d : data) {
  if (prev == null) {  // first number
    resultSet.add(d);
  } else if (d != prev + 1) {  // a gap encountered
    resultSet.add(prev);
    resultSet.add(d);
  }
  prev = d;
}

if (prev != null) {  // last number
  resultSet.add(prev);
}

// resultSet will contain what you want.

我相信问题可以大大简化为:

循环遍历列表,当当前数字不是前一个数字+1时,将当前值和前一个值添加到结果集中

这意味着,不要考虑为连续范围添加开始和结束,而是考虑在遇到间隙时添加两侧

psuedo代码:

Set<Integer> resultSet = new LinkedHashSet<Integer>();

Integer prev = null;

for (Integer d : data) {
  if (prev == null) {  // first number
    resultSet.add(d);
  } else if (d != prev + 1) {  // a gap encountered
    resultSet.add(prev);
    resultSet.add(d);
  }
  prev = d;
}

if (prev != null) {  // last number
  resultSet.add(prev);
}

// resultSet will contain what you want.


您想在ArrayList中保存范围,但如何知道范围是22001-22004,而不是22004-22010?您可能想考虑另一个对象来保存这些值,这些值更适合。另外,请重新标记您使用的语言,我假设是Java。我不太理解这个问题,因为22010和22011是连续的。。如果你解释得更好,我就可以发布答案了!他试图存储每个范围的开始和结束。如果不是范围的一部分,则存储单个值。因此,范围为2将导致两个连续的数字。您希望在ArrayList中保存范围,但如何知道范围是22001-22004,而不是22004-22010?您可能想考虑另一个对象来保存这些值,这些值更适合。另外,请重新标记您使用的语言,我假设是Java。我不太理解这个问题,因为22010和22011是连续的。。如果你解释得更好,我就可以发布答案了!他试图存储每个范围的开始和结束。如果不是范围的一部分,则存储单个值。两个数字的范围将导致两个连续的数字。我爱你。真正地我刚刚添加了最后一个值,非常完美,非常感谢你,伙计。好吧,简单看看代码,在我看来,这个逻辑只适用于包含3个或更多元素的列表。我爱你。真正地我刚刚添加了最后一个值,非常完美,非常感谢你,伙计。好吧,简单看看代码,在我看来,这个逻辑只适用于包含3个或更多元素的列表。仔细阅读问题。他想要子列表,不想只打印子列表console@tgkprog是的。如何表示结果是第二个主题,关键是条件。我假设未来的开发人员非常热衷于编写他们自己的解决方案。与另一个答案相同,只有当列表包含3个或更多元素时,这才有效。@AdrianShum,除了这是简化代码之外,你错了。我将为至少有两个项目的数组正常工作。但这里的输入验证并非如此。请仔细阅读问题。他想要子列表,不想只打印子列表console@tgkprog是的。如何表示结果是第二个主题,关键是条件。我假设未来的开发人员非常热衷于编写他们自己的解决方案。与另一个答案相同,只有当列表包含3个或更多元素时,这才有效。@AdrianShum,除了这是简化代码之外,你错了。我将为至少有两个项目的数组正常工作。但这里的输入验证并非如此。