Java 如何对向量进行排序<;向量<;字符串>&燃气轮机;在多个元素上保持子项分组在一起?

Java 如何对向量进行排序<;向量<;字符串>&燃气轮机;在多个元素上保持子项分组在一起?,java,arrays,sorting,vector,Java,Arrays,Sorting,Vector,因此,我从RESTAPI返回JSON数据,其中数据已经由日期字段排序,然后添加到JTable中使用的向量>。我需要将具有相同5位密钥的项目分组在一起,然后根据附加标识符desc order(3,2,1)对这些项目进行排序,其中date决定下一个5位密钥 例如: [[28696, 2, 11/15/19 17:57]] [[28696, 1, 11/15/19 17:56]] [[00972, 2, 11/15/19 17:55]] [[28696, 3, 11/15/19 17:54]] [[0

因此,我从RESTAPI返回JSON数据,其中数据已经由日期字段排序,然后添加到JTable中使用的向量>。我需要将具有相同5位密钥的项目分组在一起,然后根据附加标识符desc order(3,2,1)对这些项目进行排序,其中date决定下一个5位密钥

例如:

[[28696, 2, 11/15/19 17:57]]
[[28696, 1, 11/15/19 17:56]]
[[00972, 2, 11/15/19 17:55]]
[[28696, 3, 11/15/19 17:54]]
[[00972, 1, 11/15/19 17:53]]

应该是

[[28696, 3, 11/15/19 17:54]]
[[28696, 2, 11/15/19 17:57]]
[[28696, 1, 11/15/19 17:56]]
[[00972, 2, 11/15/19 17:55]]
[[00972, 1, 11/15/19 17:53]]


请注意,28696是组中的第一个项目,是整个数据集中最新的项目

只需一次
sort
操作就无法实现您想要的。相反,您可以使用流来满足分组、对组进行排序以及对组内的数据进行排序的要求

首先请注意,我将您的
列表
转换为
列表
(按照Max Vollmer的建议),以便于使用和理解。如果您确实需要它作为
列表
,您可以将
数据
替换为
列表
,将
数据.get()
替换为
列表.get(?)


您想要的不是一个
sort
操作就能实现的。相反,您可以使用流来满足分组、对组进行排序以及对组内的数据进行排序的要求

首先请注意,我将您的
列表
转换为
列表
(按照Max Vollmer的建议),以便于使用和理解。如果您确实需要它作为
列表
,您可以将
数据
替换为
列表
,将
数据.get()
替换为
列表.get(?)


将其设置为
向量
,并为正确保存此数据的
MyClasss创建一个排序函数
。将其设置为
向量
,并为正确保存此数据的
MyClasss创建一个排序函数。谢谢,这完全符合需要。感谢您提供的详细代码和解释。谢谢,这完全符合需要。感谢您提供详细的代码和解释。
public static void main(String[] args) throws IOException, TransformerException {
    List<Data> list = Arrays.asList( //
            new Data("28696", "2", "11/15/19 17:57"), //
            new Data("28696", "1", "11/15/19 17:56"), //
            new Data("00972", "2", "11/15/19 17:55"), //
            new Data("28696", "3", "11/15/19 17:54"), //
            new Data("00972", "1", "11/15/19 17:53"));

    Comparator<Data> sortByTimestamp = Comparator.comparing(Data::getTimestamp).reversed();
    Comparator<Data> sortByOccurrence = Comparator.comparing(Data::getOccurrence).reversed();

    // LinkedHashMap keeps the insertion order
    Collector<Data, ?, LinkedHashMap<String, List<Data>>> groupByIdKeepInsertOrder
            = Collectors.groupingBy(Data::getId, LinkedHashMap::new, Collectors.toList());

    List<Data> result = list.stream()
            .sorted(sortByTimestamp) // sort all data by timestamp, if it's already sorted by timestamp you can skip this
            .collect(groupByIdKeepInsertOrder) // group them by id keeping the timestamp order
            .values().stream() // stream the lists of data grouped together
            .peek(l -> l.sort(sortByOccurrence)) // sort each list of data by occurrence
            .flatMap(Collection::stream) // flatten the lists into a single stream
            .collect(Collectors.toList()); // collect all Data into a single list

    System.out.println(result);
    // [[28696, 3, 11/15/19 17:54],
    //  [28696, 2, 11/15/19 17:57],
    //  [28696, 1, 11/15/19 17:56],
    //  [00972, 2, 11/15/19 17:55],
    //  [00972, 1, 11/15/19 17:53]]
}
private static class Data {
    private final String id;
    private final String occurrence;
    private final String timestamp;

    public Data(String id, String occurrence, String timestamp) {
        this.id = id;
        this.occurrence = occurrence;
        this.timestamp = timestamp;
    }

    public String getId() { return id; }
    public String getOccurrence() { return occurrence; }
    public String getTimestamp() { return timestamp; }
    @Override public String toString() { return "[" + id + ", " + occurrence + ", " + timestamp + "]";}
}