0

現在、2 つの列のセットがありますが、どのようにプログラムすればよいのか、どのクラスのセットを使用するのかがわかりません。両方とも別々の配列にあります。1 つは文字用、もう 1 つは数字用です。

 a  12
 b  9
 c  156

つまり、a は 12 に対応し、b は 9 などに対応します。リストは実際にはテキスト ファイル内の文字の頻度なので、26 個あります。両方が同じ配列にありません。私はそれらの両方に別々の配列を持っているので。並べて降順にしたいです。出力は次のようになります。

 c   156
 a   12
 b   9    

ArrayList、HashMap、または Tree Map のさまざまな機能については、まだよくわかりません。それで、これについて何か助けはありますか?

4

4 に答える 4

2
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Test {

    public static void main(String[] args) {

        HashMap<String,Integer> map = new HashMap<String,Integer>();
        ValueComparator bvc =  new ValueComparator(map);
        TreeMap<String,Integer> sorted_map = new TreeMap(bvc);

        map.put("A",5);
        map.put("B",60);
        map.put("C",65);
        map.put("D",3);

        System.out.println("unsorted map");
        for (String key : map.keySet()) {
            System.out.println("key/value: " + key + "/"+map.get(key));
        }

        sorted_map.putAll(map);

        System.out.println("results");
        for (String key : sorted_map.keySet()) {
            System.out.println("key/value: " + key + "/"+sorted_map.get(key));
        }
    }

}

class ValueComparator implements Comparator {

  Map base;
  public ValueComparator(Map base) {
      this.base = base;
  }

  public int compare(Object a, Object b) {

    if((Integer)base.get(a) < (Integer)base.get(b)) {
      return 1;
    } else if((Integer)base.get(a) == (Integer)base.get(b)) {
      return 0;
    } else {
      return -1;
    }
  }
}
于 2012-06-02T05:25:18.220 に答える
1

キャラクターと頻度をデータメンバーとして持つクラスを作成し、そのクラスにComparableインターフェースを実装させることができます。

ここには 2 つのオプションがあり、次のいずれかを実行できます。

  • インターフェイスを実装するクラスにすべてのオブジェクトを挿入しListます (例: ArrayList)。次に、 を呼び出しCollections.sort(List<T> list)ますList

  • すべてのオブジェクトを に挿入しますTreeSet。ソートされたアイテムは から入手できますiterator()

質問から、2 つのデータはそもそも既存のオブジェクトのメンバーではないようです。可能であれば、その文字と周波数に対して新しいクラスを作成する必要はありません。既存のオブジェクトを に挿入し、インターフェイスでList拡張するクラスを実装し、 で並べ替えることができます。ComparatorListCollections.sort(List<T> list, Comparator<? super T> c)

于 2012-06-02T05:06:35.950 に答える
1

次の 2 つのリストがあります。

[a, b, c] 
[12, 9, 156]

最初に、2 つのリストを一緒に圧縮して、tuplesのリスト (またはその射影) を取得します

[(a, 12), (b, 9), (c, 156)]

次に、このリスト各タプルの 2 番目の項目で、必要な順序で並べ替えます。

[(c, 156), (a, 12), (b, 1)]

これを 2 つのリストに解凍します。

[c, a, b]
[156, 12, 1]

そして、あなたの答えがあります。

イタリック体の単語は、上記のソリューションで使用されている一般的な抽象化を示しています。これらはすべて、このライブラリで既に利用可能である可能性があります。

于 2012-06-02T06:31:29.920 に答える
0

これを試して:

public static void main(String[] args) throws Exception {
    char[] letters = { 'a', 'b', 'c' };
    int[] numbers = { 12, 9, 156 };
    printDescendind(letters, numbers);
}

public static void printDescendind(char[] letters, int[] numbers) {
    class Holder implements Comparable<Holder> {
        char letter;
        int number;
        public int compareTo(Holder o) {
            return number != o.number ? o.number - number : letter - o.letter;
        }
        public String toString() {
            return String.format("%s   %s", letter, number);
        }
    }
    List<Holder> list = new ArrayList<Holder>(letters.length);
    for (int i = 0; i < letters.length; i++) {
        Holder h = new Holder();
        h.letter = letters[i];
        h.number = numbers[i];
        list.add(h);
    }
    Collections.sort(list);
    for (Holder holder : list) {
        System.out.println(holder);
    }
}
于 2012-06-02T05:26:12.783 に答える