0

我现在有两组列,但我不确定如何对其进行编程以及我可以使用哪组类。两者都在单独的数组中。一个用于字母,另一个用于数字。

 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,实现在接口上扩展的类,然后使用 对进行Comparator排序。ListCollections.sort(List<T> list, Comparator<? super T> c)

于 2012-06-02T05:06:35.950 回答
1

您有以下两个列表。

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

首先,将两个列表压缩在一起,以便获得tuples的列表(或其投影) 。

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

然后按每个元组中的第二项对该列表进行排序,无论您想要什么顺序。

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

现在将其解压缩到两个列表中。

[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 回答