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

シーケンスの 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 に答える
2
  • データを ' ' で分割します。
  • を作成HashMap<String, List<String[]>>
  • 各行:
    • マップにキーが含まれているかどうかを確認します (split[1])
      • そのキーにリストがない場合は作成します
      • split[1] を追加し、正しいリストに分割します
  • マップを反復処理し、それぞれを並べ替えますList
  • データを出力する
于 2012-05-25T07:49:40.097 に答える
1

JDKには、ソートされたリストを作成するためだけのクラスがあります。これは、「java.util.PriorityQueue」という名前です(他のSorted *インターフェースとは多少異なります)。ComparablesまたはComparatorを使用してソートできます。

Collections.sort(...)を使用して並べ替えられたリストとの違いは、これにより常に順序が維持され、並べ替えられたArrayListへの挿入がO(n)(つまり、バイナリ検索と移動を使用します)。

ただし、List以外では、PriorityQueueはインデックス付きアクセス(get(5))をサポートしていません。ヒープ内のアイテムにアクセスする唯一の方法は、一度に1つずつアイテムを取り出すことです(したがって、PriorityQueueという名前です)。

于 2012-05-25T07:44:10.900 に答える
1

データをに入れ、Listを使用Collections.sort()して並べ替えます。

于 2012-05-25T07:38:47.787 に答える
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 に答える