将列表内容排序到新列表

时间:2018-10-12 16:54:42

标签: java sorting arraylist

我有一个未排序的列表,其中包含不明数量的项目,范围为1000。这些项目都包含一个标签,用于确定应该去的地方。为了避免多次遍历列表中的每个项目,我想将此列表拆分为一定数量的子列表,这些子列表仅包含某些标签的项目。

List<Item> allItems = getItemsFromSomewhere();

List<Item> itemsLabeledA1 = new ArrayList<>();
List<Item> itemsLabeledA2 = new ArrayList<>();
List<Item> itemsLabeledB1 = new ArrayList<>();
...
List<Item> itemsLabeledL3 = new ArrayList<>();

为了使问题更复杂,某些列表要求添加项目的 range ,这就是为什么每个项目都被标记为“ A1”,“ A2”,“ A3”之类的原因。这些列表要求每个带有A标签的项目添加到其中。但是,并非所有标签都具有这些聚合列表。我可能必须汇总所有带有A标签的项目,而不是汇总所有带有B标签的项目,同时还要在自己的列表中对A1,B1等进行排序。

鉴于上面的示例,我如何在一次迭代中优雅地拆分整个列表?我最初的想法是使用ifs或switch块,但这是一个丑陋的解决方案。

allItems.forEach(item -> {
    if (item.getLabel().contains("A1")) { 
       itemsLabeledA1.add(item);
       allItemsLabeledA.add(item);
    }
    else if (item.getLabel().contains("B1")) itemsLabeledB1.add(item);
    ...
    else if (item.getLabel().contains("L3")) itemsLabeledL3.add(item);
});

有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

我将在两个单独的流式传输操作中使用groupingBy

l_i

答案 1 :(得分:1)

也许您可以尝试使用HashMap,其中键是标签,值是子列表?

HashMap<String, List<Item>> map = new HashMap<String, List<Item>>();
for (String label : labels) {
    map.put(label, new List<Item>);
}
allItems.forEach(item -> {
    String label = item.getLabel();
    map.get(label).add(item);
}

答案 2 :(得分:1)

您似乎正在对商品进行分类。为此,您需要根据规范创建不同的组,然后将每个项目添加到其组中。如果我正确理解了您的要求,则可以按以下步骤完成操作:

Map<String, List<Item>> map = new LinkedHashMap<>(); // keeps insertion order
allItems.forEach(it -> {
    String lbl = it.getLabel();
    map.computeIfAbsent(lbl, k -> new ArrayList<>()).add(it);
    if (needsToBeAggregated(lbl)) {
        map.computeIfAbsent(lbl.substring(0, 1), k -> new ArrayList<>()).add(it);
    }
});

boolean needsToBeAggregated(String label)是您决定是否应将项目添加到聚合组的一种方法。

此解决方案不使用流,而是使用Java 8的Map.computeIfAbsent方法。