我有一个像这样的2D字符串数组:
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来订购它,但是如何按行高效地进行呢?
发布于 2015-05-27 03:08:05
您可以随时创建新的临时对象数组(或列表),这些对象可以存储sum和columnId的值。然后使用sum对此数组进行排序。
这样,columnId的新顺序将显示应该如何对原始数组进行排序。
发布于 2015-05-27 02:55:42
二维字符串数组可能不是最好的表示形式。对你来说,操纵数据会很困难。我会将产品和日期信息封装在它自己的对象中:
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()只是在列表之外创建一个“流”。这让你可以访问Stream API,它提供了一系列与转换、收集、缩减、聚合相关的方法,etc.collect(...)将结果收集到某种类型的对象中。在这里,我们通过对productName进行分组来创建地图(这样所有具有相同产品名称的实例都将被分组在一起),然后我们基于amount求和。这实际上是在计算2-D数组的最后一行中的相同信息。此信息在映射中返回,其中键是产品名称,值是该特定产品的所有数量的总和,name.entrySet().stream()将项目集中的项目流式传输。项目集合是映射中所有项目的集合。回想一下,我们将信息收集到一个映射中,现在我们要对其进行排序。因此,我们需要查看映射中的每个条目。因此,我们将访问项目集,并在it.sorted()之外创建一个新的流,这意味着我们希望以某种方式对流中的项进行排序。在这里,我们传入一个比较器,它告诉我们要按映射条目的值排序(即,此collect调用中的amounts)..collect(...)之和,我们只是将信息收集到一个新映射中。此映射也将以产品名称为关键字,但将根据amount总和进行排序。我们特别告诉它使用LinkedHashMap变体创建一个新地图,这样我们就可以保持秩序。https://stackoverflow.com/questions/30466432
复制相似问题