如何在java中对列表列表的元素进行分组

时间:2014-08-26 05:12:10

标签: java arraylist

我有一个arrayList的arrayList, 例如:

mainList = [[2,1],[3,1],[5,1],[6,2],[11,2],[7,2],[9,3],[10,3],[11,3],....,[n,m]], 其中n和m可以是任何值。

现在我想根据innerList第二元组值对元素进行分组,并将所有组放在不同的arrayList中,即:

newList1 =[2,3,5], newList2=[6,11,7]和其他群组一样,我找不到任何解决方案,我是java新手,请提出一些建议。

    public class CsvParser {
        public static void main(String[] args) {
            try {
                FileReader fr = new FileReader((args.length > 0) ? args[0] : "data.csv");
                Map<String, List<String>> values = parseCsv(fr, " ", true);
                System.out.println(values);

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    public static Map<String, List<String>> parseCsv(Reader reader, String separator, boolean hasHeader) throws IOException {
        Map<String, List<String>> values = new LinkedHashMap<String, List<String>>();
        List<String> columnNames = new LinkedList<String>();
        BufferedReader br = null;
        br = new BufferedReader(reader);
        String line;
        int numLines = 0;
        while ((line = br.readLine()) != null) {
            if (StringUtils.isNotBlank(line)) {
                if (!line.startsWith("#")) {
                    String[] tokens = line.split(separator);
                    if (tokens != null) {
                        for (int i = 0; i < tokens.length; ++i) {
                            if (numLines == 0) {
                                columnNames.add(hasHeader ? tokens[i] : ("row_"+i));
                            } else {
                                List<String> column = values.get(columnNames.get(i));
                                if (column == null) {
                                    column = new LinkedList<String>();
                                }
                                column.add(tokens[i]);
                                values.put(columnNames.get(i), column);
                            }
                        }
                    }
                    ++numLines;
                }
            }
        }
        return values;
    }
}

1 个答案:

答案 0 :(得分:1)

这样的东西就足够了。我确信它可以在我赶紧写完之后清理干净。

import static java.util.Arrays.asList;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        try {

            List<List<Integer>> outerList = new ArrayList<List<Integer>>();
            outerList.add(new ArrayList<Integer>(asList(11,2)));
            outerList.add(new ArrayList<Integer>(asList(2,1)));
            outerList.add(new ArrayList<Integer>(asList(11,3)));
            outerList.add(new ArrayList<Integer>(asList(6,2)));
            outerList.add(new ArrayList<Integer>(asList(7,2)));
            outerList.add(new ArrayList<Integer>(asList(9,3)));
            outerList.add(new ArrayList<Integer>(asList(3,1)));
            outerList.add(new ArrayList<Integer>(asList(5,1)));
            outerList.add(new ArrayList<Integer>(asList(10,3)));


            if(outerList.size() == 0) return;

            Collections.sort(outerList, new CustomComparator());

            System.out.println(outerList);

            List<List<Integer>> newOuterList = new ArrayList<List<Integer>>();
            int i = 0;
            int value = outerList.get(0).get(1);
            while(i < outerList.size()) {
                List<Integer> newInnerList = new ArrayList<Integer>();
                while(i < outerList.size()) {
                    if(outerList.get(i).get(1) == value) {
                        newInnerList.add(outerList.get(i).get(0));
                        i++;
                    } else {
                        value = outerList.get(i).get(1);
                        break;
                    }
                }
                newOuterList.add(newInnerList);
            }
            System.out.println(newOuterList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class CustomComparator implements Comparator<List<Integer>> {
    @Override
    public int compare(List<Integer> o1, List<Integer> o2) {
        return o1.get(1).compareTo(o2.get(1));
    }
}