我有一个像这样的2D String [] []数组:
Date Product1 Product2 Product3
01/01 10 50 100
02/01 10 50 100
03/04 10 50 100
Sum 30 150 300
我希望按Sum行升序对其进行排序。最终结果应该是:
Date Product3 Product2 Product1
01/01 100 50 10
02/01 100 50 10
03/04 100 50 10
Sum 300 150 30
我可以使用Arrays.sort每行订购它,但是如何通过行有效地执行它?
答案 0 :(得分:1)
您始终可以创建可以存储sum
和columnId
值的对象的新临时数组(或列表)。然后使用sum
订购此数组
这样,columnId
的新订单将向您显示原始数组的排序方式。
答案 1 :(得分:0)
二维字符串数组可能不是最好的代表。你操纵数据会很困难。我会将产品和日期信息封装在自己的对象中:
public class ProductDateInformation { //Use a better name - this is just a placeholder because I'm not sure what it is you're describing
private String productName;
private Date date;
private int amount;
...
}
然后你可以保持List<ProductDateInformation> productList
。在这里,您可以按productName
分组,只需总结amount
,然后按其排序。这使用Java 8的流API:
Map<String, Integer> sorted = productList
.stream()
.collect(
Collectors.groupingBy(ProductDateInformation::getProductName),
Collectors.summingInt(ProductDateInformation::getAmount)
).entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
Entry::getKey,
Entry::getValue,
(value1, value2) -> value1,
LinkedHashMap::new
));
所以这里发生的事情如下:
stream()
只是创建一个&#34;流&#34;列出一个清单。这使您可以访问Stream API,它为您提供了一系列与转换,收集,缩减,聚合等相关的方法。collect(...)
将结果收集到某种对象中。在这里,我们通过对productName
进行分组来创建地图(因此所有具有相同产品名称的实例将组合在一起),然后我们根据amount
求和。这基本上是计算二维数组最后一行中的相同信息。此信息将在地图中返回,其中键是产品名称,值是该特定产品名称的所有金额的总和。entrySet().stream()
流式传输条目集中的项目。条目集是地图中所有条目的集合。回想一下,我们将信息收集到地图中,现在我们要对其进行排序。所以我们需要查看地图中的每个条目。因此,我们将访问条目集并从中创建一个新流。sorted()
表示我们希望以某种方式对流中的项目进行排序。在这里,我们传递一个比较器,表示我们想要按地图条目的值(即金额的总和)进行排序。.collect(...)
在此次collect
调用中,我们只是将信息收集到新地图中。此地图也将按产品名称键入,但将根据amount
总和进行排序。我们具体告诉它使用LinkedHashMap
变体创建新地图,以便我们可以保留顺序。