Java程序,用于对列表<list> </list>中给定数字的连续编号进行分组

时间:2014-10-08 16:31:16

标签: java algorithm list math

假设您获得了像

这样的唯一数字
11,2,7,6,17,13,8,9,3,5,12

结果将是包含子列表的数字组列表,即

[2,3]-[5,6,7,8,9]-[11,12,13]-[17]

我采用这种方法来解决这个问题:

int[] a = { 11, 2, 7, 6, 13,17, 8, 9, 3, 5, 12 };

Arrays.sort(a);
List<List<Integer>> ListMain = new ArrayList<>();
List<Integer> temp = new ArrayList<>();

for (int i = 0; i < a.length; i++) {
    if (a[i + 1] == a[i] + 1) {
        temp.add(a[i + 1]);
    } else {
        ListMain.add(temp);
        temp.clear();
    }
}

2 个答案:

答案 0 :(得分:6)

你的整体逻辑大多是正确的。但是,在执行过程中会遇到一些问题。

  1. 您获得了数组索引超出范围的异常,因为您在a[i+1]时调用i = a.length。将循环条件更改为a.length - 1
  2. 每次都需要使用新的内部ArrayList,否则每个数组都将被清除。将temp.clear();更改为temp = new ArrayList<>();
  3. 您需要将新列表初始化为第一个元素,而不是空列表。当您检测到需要新的子列表时,请在开头添加temp.add(a[0]);temp.add(a[i+1])
  4. 您需要在最后添加最终列表,因为在循环结束时不会调用您的条件。
  5. 以下是修改过的程序:

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Arrays;
    
    public class SubList {
        public static void main(String... args) {
            int[] a = { 11, 2, 7, 6, 13,17, 8, 9, 3, 5, 12 };
    
            Arrays.sort(a);
            List<List<Integer>> ListMain = new ArrayList<>();
            List<Integer> temp = new ArrayList<>();
            temp.add(a[0]);
    
            for (int i = 0; i < a.length - 1; i++) {
                if (a[i + 1] == a[i] + 1) {
                    temp.add(a[i + 1]);
                } else {
                    ListMain.add(temp);
                    temp = new ArrayList<>();
                    temp.add(a[i+1]);
                }
            }
    
            ListMain.add(temp);
    
            System.out.println(ListMain);
        }
    }
    

    输出:

    [[2, 3], [5, 6, 7, 8, 9], [11, 12, 13], [17]]
    

答案 1 :(得分:2)

感谢Garis M Suero的建议,之后我得到了回答

    int[] a = { 11, 2, 7, 6, 13,17, 8, 9, 3, 5, 12 };

    Arrays.sort(a);

    List<List<Integer>> listMain = new ArrayList<List<Integer>>();
    List<Integer> temp = new ArrayList<>();

    for (int i = 0; i < a.length; i++) {
        if ((i + 1<a.length)&&( a[i] + 1==a[i + 1])) {
            temp.add(a[i]);
        } else {
            temp.add(a[i]);
            listMain.add(temp);
            temp  = new ArrayList<>();
        }

    }

    for (List<Integer> lstI : listMain) {
            for (Integer i : lstI) {
                System.out.println(i);
            }
        System.out.println("================");
     }