Java 将元素放在树映射的末尾
我有一个树映射,其中我按升序对元素进行排序,如0,1,2,3等。这些元素按其值排序,即0,1,2等为值。我使用了比较器对它们进行排序。我希望保留此顺序,但我希望将值为0的元素放在映射的末尾。如何操作?您可以修改比较器并处理它们0是最大的数字您可以修改比较器并将0视为最大的数字正如您已经说过的,您的树映射是排序的,因此允许您在“末尾”附加一个元素是完全没有意义的,即使树映射不是这样工作的 您可以做的是配置比较器,使其决定“0”是最大的元素,因此他将对所有“0”进行排序。Java 将元素放在树映射的末尾,java,collections,treemap,Java,Collections,Treemap,我有一个树映射,其中我按升序对元素进行排序,如0,1,2,3等。这些元素按其值排序,即0,1,2等为值。我使用了比较器对它们进行排序。我希望保留此顺序,但我希望将值为0的元素放在映射的末尾。如何操作?您可以修改比较器并处理它们0是最大的数字您可以修改比较器并将0视为最大的数字正如您已经说过的,您的树映射是排序的,因此允许您在“末尾”附加一个元素是完全没有意义的,即使树映射不是这样工作的 您可以做的是配置比较器,使其决定“0”是最大的元素,因此他将对所有“0”进行排序。 请注意,最后的“0”的顺序
请注意,最后的“0”的顺序是随机的,这取决于排序算法。正如您已经说过的,您的树映射是排序的,因此允许您在“末尾”附加元素是完全没有意义的,即使树映射不是这样工作的 您可以做的是配置比较器,使其决定“0”是最大的元素,因此他将对所有“0”进行排序。
请注意,最后的“0”的顺序是随机的,这取决于排序算法。刚刚意识到,您希望根据映射值而不是键进行排序。比较器没有得到值,这使得它有点复杂。新方法使用第二个(未排序)映射,该映射仅收集所有值,比较器可使用该映射查找键的值:
private static Map<String, Integer> helper = new HashMap<String, Integer>();
private static Comparator<String> myComparator
= new Comparator<String>() {
public int compare(String s1, String s2) {
Integer i1 = helper.get(s1);
Integer i2 = helper.get(s2);
if (i1 == 0) return 1; // i1 > i2
if (i2 == 0) return -1; // i1 < i2
return i1.compareTo(i2);
}
};
public static void main (String[] args) throws java.lang.Exception {
helper.put("minus one", -1);
helper.put("zero", 0);
helper.put("one", 1);
helper.put("very much", Integer.MAX_VALUE);
helper.put("nothing", 0);
helper.put("null", 0);
Map<String, Integer> map = new TreeMap<String, Integer>(myComparator);
map.putAll(helper);
for(Map.Entry<String, Integer> entry:map.entrySet()) {
System.out.printf("%s = %s%n", entry.getKey(), entry.getValue());
}
}
刚刚意识到,您希望对映射值而不是键进行排序。比较器没有得到值,这使得它有点复杂。新方法使用第二个(未排序)映射,该映射仅收集所有值,比较器可使用该映射查找键的值:
private static Map<String, Integer> helper = new HashMap<String, Integer>();
private static Comparator<String> myComparator
= new Comparator<String>() {
public int compare(String s1, String s2) {
Integer i1 = helper.get(s1);
Integer i2 = helper.get(s2);
if (i1 == 0) return 1; // i1 > i2
if (i2 == 0) return -1; // i1 < i2
return i1.compareTo(i2);
}
};
public static void main (String[] args) throws java.lang.Exception {
helper.put("minus one", -1);
helper.put("zero", 0);
helper.put("one", 1);
helper.put("very much", Integer.MAX_VALUE);
helper.put("nothing", 0);
helper.put("null", 0);
Map<String, Integer> map = new TreeMap<String, Integer>(myComparator);
map.putAll(helper);
for(Map.Entry<String, Integer> entry:map.entrySet()) {
System.out.printf("%s = %s%n", entry.getKey(), entry.getValue());
}
}
听起来,无论你想做什么,都应该用更好的方式去做。例如,
0
只能出现一次,因此它不能出现在开头和结尾。也许你可以澄清你需要做什么,我们可以想出一个更简单的解决方案。我正在使用比较器对某些东西进行排序,也有0。但我希望最后有0。这就是我想要的。@Peter Lawreyin为什么不使用0
整数。MAX_VALUE?我没有设置这些值。所有这些值都来自在xml中使用购物引擎,我使用摘要对其进行解析。我现在必须对值进行排序,最后将设置空值(0在这里仅被视为空值)。我希望我没有遗漏任何内容。如果您确实无法控制这些值,最简单的解决方案将是按照您的建议执行。使用0
作为空值是个坏主意,但似乎您别无选择。听起来您尝试做的任何事情都应该以更好的方式完成。例如,0
只能出现一次,因此它不能出现在开头和结尾。也许你可以澄清你需要做什么,我们可以想出一个更简单的解决方案。我正在使用比较器对某些东西进行排序,也有0。但我希望最后有0。这就是我想要的。@Peter Lawreyin为什么不使用0
整数。MAX_VALUE?我没有设置这些值。所有这些值都来自在xml中使用购物引擎,我使用摘要对其进行解析。我现在必须对值进行排序,最后将设置空值(0在这里仅被视为空值)。我希望我没有遗漏任何内容。如果您确实无法控制这些值,最简单的解决方案将是按照您的建议执行。使用0
作为空值是个坏主意,但您似乎别无选择。您能帮我吗?我无法通过上述方式获取它们如果我有多个0怎么办?我将无法使用“return i1.comapreTo(i2)”,因为它不允许重复。我使用if(val10
作为键放置,则新值将替换现有值。这就是贴图(和集合)的工作方式。我们无法更改地图以接受重复的密钥。如果我按你的方式使用,我将无法允许重复扫描。你能帮我吗?我无法通过上述方式获取它们如果我有多个0怎么办?我将无法使用“return i1.comapreTo(i2)”,因为它不允许重复。我使用if(val10
作为键放置,则新值将替换现有值。这就是贴图(和集合)的工作方式。我们无法更改地图以接受重复的密钥。如果我按您的方式使用,我将无法允许重复