1

我在排序时遇到问题。数据格式为:

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 

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

4

5 回答 5

2
  • 按“”拆分您的数据。
  • 创建一个HashMap<String, List<String[]>>
  • 对于每一行:
    • 查看地图是否包含键(split[1])
      • 如果该键处没有 List,则创建一个
      • 添加 split[1],拆分到正确的列表
  • 遍历您的地图并订购每个List
  • 输出数据
于 2012-05-25T07:49:40.097 回答
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();
    }
于 2012-05-25T07:54:00.443 回答
1

将数据放入 aList并使用Collections.sort()它进行排序。

于 2012-05-25T07:38:47.787 回答
1

JDK中有一个类只是为了有一个排序列表。它被命名(与其他 Sorted* 接口有点乱)“java.util.PriorityQueue”。它可以对 Comparables 或使用 Comparator 进行排序。

与使用 Collections.sort(...) 排序的 List 的区别在于,这将始终保持顺序,并且通过使用堆数据结构具有良好的插入性能,其中插入已排序的 ArrayList 将是 O(n) (即,使用二进制搜索和移动)。

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

于 2012-05-25T07:44:10.900 回答
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));
        }
    }
于 2012-05-25T19:25:32.127 回答