首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中基于行的二维数组排序

Java中基于行的二维数组排序
EN

Stack Overflow用户
提问于 2015-05-27 02:43:02
回答 2查看 301关注 0票数 0

我有一个像这样的2D字符串数组:

代码语言:javascript
运行
复制
Date     Product1    Product2     Product3
01/01    10          50           100
02/01    10          50           100
03/04    10          50           100
Sum      30          150          300

我想按Sum行的升序进行排序。最终结果应该是:

代码语言:javascript
运行
复制
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来订购它,但是如何按行高效地进行呢?

EN

回答 2

Stack Overflow用户

发布于 2015-05-27 03:08:05

您可以随时创建新的临时对象数组(或列表),这些对象可以存储sumcolumnId的值。然后使用sum对此数组进行排序。

这样,columnId的新顺序将显示应该如何对原始数组进行排序。

票数 1
EN

Stack Overflow用户

发布于 2015-05-27 02:55:42

二维字符串数组可能不是最好的表示形式。对你来说,操纵数据会很困难。我会将产品和日期信息封装在它自己的对象中:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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变体创建一个新地图,这样我们就可以保持秩序。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30466432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档