我现在有两组列,但我不知道如何编程它以及我使用它的类集。两者都在单独的数组中。一个用于字母,另一个用于数字。
a 12
b 9
c 156
所以a对应12而b对应9等等。列表实际上是文本文件中的字母频率,所以我有26个。 两者都不在同一个数组中。因为我有两个单独的数组。我想尝试安排 并使它们以下降的方式。 这样输出就是:
c 156
a 12
b 9
我仍然不确定ArrayList或HashMap或Tree Map的各种功能。那么对此有何帮助?
答案 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
接口的类中(例如ArrayList
)。然后拨打Collections.sort(List<T> list)
上的List
。
将所有对象插入TreeSet
。您可以通过iterator()
获取已排序的项目。
从问题来看,似乎这两个数据首先不是某个现有对象的成员。如果他们有机会,你不必为角色和频率创建一个新的类。您可以将现有对象插入List
,实现在Comparator
界面上扩展的类,并使用List
对Collections.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);
}
}