1

次のように定義された HashMap があります

Map<String, ArrayList<String>>  map = new HashMap<String, ArrayList<String>>();

次に、データベースからのデータをこのハッシュマップに保存し、コンソールに次のようにコンテンツを表示します。 ---> の左側のエントリは ID であり、右側のエントリはこの ID によって使用されるタグです。

165767--->[dual-boot, windows, uninstall, ati, graphics, multiple-monitors]
6873 --->[kubuntu, re-installation]
34228--->[11.10, unity, launcher, libreoffice, icons]

使用したタグの数、つまりmap.get(key).size()に基づいて ID を降順で並べ替えて、出力が ID 165767、34228、6873 などになるようにします。

私はTreeMapでそれをやってみましたが、キーの値ではなくサイズに基づいてそれを行う方法を理解することができません。

4

3 に答える 3

3

これにより、ソートされた ID のリストが作成されます。

List<String> sortedIds = new ArrayList<String>(map.getKeys());
Collections.sort(sortedIds, new Comparator<String>() {
    public int compare(String a, String b) {
        return map.get(b).size() - map.get(a).size();
    }
});

変更可能な値 ( の長さなど) でソートされたSortedMap( のような)を維持することは決してないというわけではありません。並べ替えられた順序は値の検索に使用されるため、コレクションがそれを認識しない場合よりも大きくなると、非常に大きな問題が発生する可能性があります。TreeMapArrayList"id123""id456"

于 2013-11-09T20:36:00.577 に答える
0

編集

ID のサイズではなく、タグの数に基づいて出力をソートする必要があります

Map<String, ArrayList<String>>  map = new TreeMap<String, ArrayList<String>>();


map.put("165767",new ArrayList<String>(Arrays.asList("dual-boot", "dual-boot", "windows", "uninstall", "ati", "graphics", "multiple-monitors")));
map.put("6873",new ArrayList<String>(Arrays.asList("kubuntu", "kubuntu", "re-installation")));
map.put("0000000000000000",new ArrayList<String>(Arrays.asList("test","test", "test")));
map.put("0125",new ArrayList<String>(Arrays.asList("dual-boot", "windows", "uninstall", "ati", "graphics", "multiple-monitors")));


for(ArrayList<String> l : map.values()){
    Set<String> hs = new HashSet<>();
    hs.addAll(l);
    l.clear();
    l.addAll(hs);
}

List<ArrayList<String>> l = new ArrayList<>(map.values());
Collections.sort(l, new Comparator<ArrayList<String>>(){
    public int compare(ArrayList<String> s1, ArrayList<String> s2){
        return Integer.compare(s2.size(), s1.size());                
    }});

for(ArrayList<String> a : l){
    Iterator<Entry<String, ArrayList<String>>> iter = map.entrySet().iterator();
    while (iter.hasNext()) {
        Entry<String, ArrayList<String>> e = iter.next();
        if(e.getValue().equals(a)){

            System.out.println(e.getKey() + "-" + a);
            iter.remove();
        }
    }
}

出力:

0125-[uninstall, dual-boot, graphics, windows, ati, multiple-monitors]
165767-[uninstall, dual-boot, graphics, windows, ati, multiple-monitors]
6873-[re-installation, kubuntu]
0000000000000000-[test]
于 2013-11-09T20:42:56.533 に答える