以降序排列相应的值

时间:2012-06-02 04:52:54

标签: java

我现在有两组列,但我不知道如何编程它以及我使用它的类集。两者都在单独的数组中。一个用于字母,另一个用于数字。

 a  12
 b  9
 c  156

所以a对应12而b对应9等等。列表实际上是文本文件中的字母频率,所以我有26个。 两者都不在同一个数组中。因为我有两个单独的数组。我想尝试安排 并使它们以下降的方式。 这样输出就是:

 c   156
 a   12
 b   9    

我仍然不确定ArrayList或HashMap或Tree Map的各种功能。那么对此有何帮助?

4 个答案:

答案 0 :(得分: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;
    }
  }
}

答案 1 :(得分:1)

您可以创建一个具有字符和频率作为数据成员的类,并使该类实现Comparable接口。

这里有两个选项,你可以:

从问题来看,似乎这两个数据首先不是某个现有对象的成员。如果他们有机会,你不必为角色和频率创建一个新的类。您可以将现有对象插入List,实现在Comparator界面上扩展的类,并使用ListCollections.sort(List<T> list, Comparator<? super T> c)进行排序。

答案 2 :(得分:1)

您有以下两个列表。

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

首先,压缩两个列表,以便获得元组的列表(或其投影)。

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

然后使用排序中的每个元组中的第二项对此列表进行排序。

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

现在解压缩这个回到两个列表中。

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

这是你的答案。

斜体字表示上述解决方案中使用的通用抽象,所有这些都可能已在this库中提供。

答案 3 :(得分: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);
    }
}