在文件中排序数据

时间:2012-05-25 07:37:14

标签: java sorting

我在排序方面遇到了问题。数据格式为:

b4 S0_c5 t 0.426544 
b6 S1_c5 t 1.51049 
b13 S0_c5 t 0.594502 
b13 S1_c5 t 0.537496 
b15 S1_c5 t 0.884126   
b18 S0_c5 t 0.500933 
b19 S1_c5 t 0.628472 
b22 S0_c5 t 0.437718 

并且要求的结果是:

S0_c5 b13 0.594502 b18 0.500933 b22 0.437718 b4 0.426544 
S1_c5 b6 1.51049 b15 0.884126 b19 0.628472 b13 0.537496 

该值也按降序排列。提前谢谢。

5 个答案:

答案 0 :(得分:2)

  • 按''。
  • 拆分数据
  • 创建HashMap<String, List<String[]>&gt;
  • 每行:
    • 查看地图是否包含密钥(split [1])
      • 如果该密钥没有列表,请创建一个
      • 添加拆分[1],拆分为正确的列表
  • 遍历您的地图并订购每个List
  • 输出数据

答案 1 :(得分:2)

将数据放入TreeList<String, List<String>>(因为它已排序),其中序列中的第二个单词是键,值是字符串列表,然后按以下方式对每个列表进行排序:

    Map<String, List<String[]>> map = new TreeMap<String, List<String[]>>();
    for (String s : strings) {
        String[] tokens = s.split(" ");
        List<String[]> values = map.get(tokens[1]);
        if (values == null) {
            values = new ArrayList<String[]>();
            map.put(tokens[1], values);
        }
        values.add(new String[]{tokens[0],  tokens[3]});
    }

    for (String key : map.keySet()) {
        List<String[]> list = map.get(key);
        Collections.sort(list, new Comparator<String[]>() {

            @Override
            public int compare(String[] o1, String[] o2) {
                return o1[1].compareTo(o2[1]) * -1;
            }

        });

        System.out.print(key + " ");
        for (String[] s : list) {
            System.out.print(s[0] + " " + s[1]);
        }
        System.out.println();
    }

更新: 例如。从文件中读取:

    BufferedReader br;
    try {
        br = new BufferedReader(new FileReader("d:/temp/r.res"));

        Map<String, List<String[]>> map = new TreeMap<String, List<String[]>>();
        while (br.ready()) {
            String s = br.readLine();
            if (!s.trim().isEmpty()) {
                String[] tokens = s.split(" ");
                List<String[]> values = map.get(tokens[1]);
                if (values == null) {
                    values = new ArrayList<String[]>();
                    map.put(tokens[1], values);
                }
                values.add(new String[]{tokens[0],  tokens[3]});
            }
        }
    } finally {
        br.close();
    }

答案 2 :(得分:1)

将数据放入List并使用Collections.sort()对其进行排序。

答案 3 :(得分:1)

JDK中有一个类只是为了有一个排序列表。它被命名(与其他Sorted *接口有些不正常)“java.util.PriorityQueue”。它可以对可比对象进行排序或使用比较器。

与使用Collections.sort(...)排序的List的不同之处在于,它将始终保持顺序,并且通过使用堆数据结构具有良好的插入性能,其中在排序的ArrayList中插入将为O( n)(即使用二分搜索和移动)。

然而,除了List之外,PriorityQueue不支持索引访问(get(5)),访问堆中项目的唯一方法是一次一个地将它们取出(因此名称为PriorityQueue)。

答案 4 :(得分:1)

试试这个。它会工作。

private void ReadTextFile(String filename) throws IOException
    {
        BufferedReader br = null;
        FileInputStream fin = null;
        fin = new FileInputStream(filename);
        br =new BufferedReader(new InputStreamReader(fin));
        Map<String,String> stringStringMap = new TreeMap<String, String>(Collections.reverseOrder());
        while ((line = br.readLine()) != null) {
            stringStringMap.put(line.split(" ")[3],line);
        }
        Collection<String> collection = stringStringMap.values();
        Map<String, List<String>> map = new TreeMap<String, List<String>>();
        Iterator<String> iterator = collection.iterator();
        while(iterator.hasNext()){
            String[] tokens = iterator.next().split(" ");
            List<String> values = map.get(tokens[1]);
            if (values == null) {
                values = new ArrayList<String>();
                map.put(tokens[1], values);
            }
            values.add(tokens[0] + " " + tokens[3]);
        }
        for (List<String> mapList : map.values()) {
            Collections.sort(mapList);
        }
        for (String key : map.keySet()) {
            System.out.println(key + " " + map.get(key));
        }
    }