基于Row对Java中的2D数组进行排序

时间:2015-05-26 18:43:02

标签: java arrays sorting 2d

我有一个像这样的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每行订购它,但是如何通过行有效地执行它?

2 个答案:

答案 0 :(得分:1)

您始终可以创建可以存储sumcolumnId值的对象的新临时数组(或列表)。然后使用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变体创建新地图,以便我们可以保留顺序。