Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将元素放在树映射的末尾_Java_Collections_Treemap - Fatal编程技术网

Java 将元素放在树映射的末尾

Java 将元素放在树映射的末尾,java,collections,treemap,Java,Collections,Treemap,我有一个树映射,其中我按升序对元素进行排序,如0,1,2,3等。这些元素按其值排序,即0,1,2等为值。我使用了比较器对它们进行排序。我希望保留此顺序,但我希望将值为0的元素放在映射的末尾。如何操作?您可以修改比较器并处理它们0是最大的数字您可以修改比较器并将0视为最大的数字正如您已经说过的,您的树映射是排序的,因此允许您在“末尾”附加一个元素是完全没有意义的,即使树映射不是这样工作的 您可以做的是配置比较器,使其决定“0”是最大的元素,因此他将对所有“0”进行排序。 请注意,最后的“0”的顺序

我有一个树映射,其中我按升序对元素进行排序,如0,1,2,3等。这些元素按其值排序,即0,1,2等为值。我使用了比较器对它们进行排序。我希望保留此顺序,但我希望将值为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作为键放置,则新值将替换现有值。这就是贴图(和集合)的工作方式。我们无法更改地图以接受重复的密钥。如果我按您的方式使用,我将无法允许重复