在Java中将元素拆分为不同数量的列表?

时间:2014-09-08 09:01:40

标签: java list arraylist collections

我在将元素分离到Java中的不同列表时遇到问题。问题实际上是我需要不确定数量的新列表。例如,我有一个方法,它返回一个包含一些对象的列表,但如果我在该列表中有50个元素,我想将它们拆分为小列表。对于50个元素,我需要10个新列表来将这些元素放入其中,但如果该数字将增加到100,我将需要20个新列表。有没有办法说如果需要,Java会自动为我生成一个新列表?

1 个答案:

答案 0 :(得分:1)

听起来你想要的是通常所谓的“分组”操作。要采用简化示例(来自注释),您有一堆Customer个对象,并且您希望将它们分组到按City分类的单独列表中。 (你真正的问题可能比这更复杂,但暂时让我用City例子来运行。)

要拥有任意数量的列表,组织它们的便捷方法是创建Map<City, List<Customer>>。也就是说,您有一张地图,其关键字为City,其值为List个来自Customer的{​​{1}}个对象。

编写一个贯穿输入City的普通循环并将它们存储到List<Customer>中是相当简单的,如上所述。一个小皱纹是你必须处理创建Map并在第一次遇到来自List Map的{​​{1}}时将其放入Customer之前。这是代码:

City

在Java 8中,您可以使用新方法List<Customer> inputList = ...; Map<City, List<Customer>> map = new HashMap<>(); for (Customer cust : inputList) { City city = cust.getCity(); List<Customer> custList = map.get(city); if (custList == null) { custList = new ArrayList<>(); map.put(city, custList); } custList.add(cust); } 来处理为城市中第一位客户创建列表的特殊情况,从而节省一些麻烦:

Map.computeIfAbsent()

但是如果您使用的是Java 8,那么您也可以使用Streams API,它具有Map<City, List<Customer>> map = new HashMap<>(); for (Customer cust : inputList) { City city = cust.getCity(); map.computeIfAbsent(city, k -> new ArrayList<>()); map.get(city).add(cust); } 类,可以非常方便地进行这种分组:

Collectors