如何对文件的排序进行分组?

Posted

技术标签:

【中文标题】如何对文件的排序进行分组?【英文标题】:How to group the sorting of a file? 【发布时间】:2014-01-13 01:16:50 【问题描述】:

我正在尝试使用Time stamp | level | sensor name | measurement value 结构对分隔文件进行排序,以便与具有最小时间戳的传感器关联的所有数据首先以递增的时间戳列出,然后是与具有第二小的传感器关联的所有数据时间戳将在增加时间戳等中列出......

这是一个要排序的分隔文件示例:

20140102073500|1|sensor5|0.188|  
20140102073502|1|sensor2|0.193|  
20140102073600|2|sensor5|0.577|  
20140102073603|2|sensor2|0.585|  
20140102073700|3|sensor5|1.207|  
20140102073702|3|sensor2|1.183| 

这是我想要的:

20140102073500|1|sensor5|0.188|  
20140102073600|2|sensor5|0.577|  
20140102073700|3|sensor5|1.207|  
20140102073502|1|sensor2|0.193|  
20140102073603|2|sensor2|0.585|  
20140102073702|3|sensor2|1.183|  

(请注意,我无法按“传感器名称/时间戳”排序,因为时间戳最小的传感器会从一个文件更改为另一个文件...)

这是我尝试使用的编码(仅按升序时间戳排序):

import java.io.*;
import java.util.*;
public class Sort8 
    public static void main(String[] args) throws Exception 
        Map<String, String> map;
        try (BufferedReader reader = new BufferedReader(new FileReader("C:\\Test\\test.txt"))) 
            map = new TreeMap<>();
            String line;
            while((line=reader.readLine())!=null)
                    map.put(getField(line),line);
                    System.out.println(getField(line));                                     
            
                    System.out.println(map.values()); 
        
        try (FileWriter writer = new FileWriter("C:\\Test\\test_sorted.txt")) 
            for(String val : map.values())
              //      System.out.println(val);   
                    writer.write(val) ; 
                    writer.write("\r\n");   
               
        
    
     private static String getField(String line)    
               return ((line.split("\\|")[1])+(line.split("\\|")[3]));         
     

我是 Java 新手,提前感谢您提供的帮助!

【问题讨论】:

使用比较器,在new TreeMap的参数中提供一个(); 【参考方案1】:

在树状图的构造中放置一个比较器。

    map = new TreeMap<>(new Comparator<String>() 

        @Override
        public int compare(String s1, String s2) 
            String[] a1 = s1.split("|");
            String[] a2 = s2.split("|");
            // First compare sensor
            int sensor1 = Integer.parseInt(a1[2].replace("sensor", ""));
            int sensor2 = Integer.parseInt(a2[2].replace("sensor", ""));
            if(sensor1 != sensor2) 
                return Integer.valueOf(sensor1).compareTo(sensor2);
            
            // Second compare timestamp
            long time1 = Long.parseLong(a1[0]);
            long time2 = Long.parseLong(a2[0]);
            return Long.valueOf(time1).compareTo(time2);
        

    );

【讨论】:

以上是关于如何对文件的排序进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在AngularJS ui-grid中对分组行进行排序?

SQL如何对分组后的结果进行排序并且取前几名

如何对 JSON 项目进行排序/分组

如何对请求中的数据进行排序和分组?

如何编写 sql 查询对数据集进行排序或分组

如何用EXCEL进行数据分组