2012-03-13 74 views
1

我有一个Tree Map,其中我已经按照升序排序元素,如0,1,2,3等。这些元素按它们的值排序,即0,1,2等values.I使用比较排序他们..我想要保留这个顺序,除了我想在地图的末尾放置0值的元素。怎么做?把元素放在TreeMap的末尾

+0

它听起来像你试图做的事情应该做得更好。例如,'0'只能出现一次,所以它不能出现在开始和结束处。也许你可以澄清你需要做什么,我们可以想出一个更简单的解决方案。 – 2012-03-13 08:20:02

+0

我正在使用一个比较器来排序,但也有0个。但是我想要0的结尾。那就是我想要的。@ Peter Lawrey – Azfar 2012-03-13 09:40:48

+0

为什么不使用'Integer.MAX_VALUE'来代替0? – 2012-03-13 09:42:10

回答

5

正如你已经说过,你TreeMap的排序,所以这将是完全懵了,让你的一个元素的“结束”追加,甚至尽管TreeMaps不能以这种方式工作。

你可以做的是配置你的比较器的方式,它决定“0”是最大的元素,所以他会将所有“0”排序到最后。 请注意,最后“0”的顺序是随机的,具体取决于排序算法。

1

您可以修改您的比较和治疗0作为国内最大的数字

1

刚刚意识到,您要在地图上排序而不是。比较器没有得到值使它更复杂一些。所述方法使用第二(未分类)地图,仅仅收集所有的值,并且可以通过比较被用于查找值的密钥:

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()); 
    } 
} 

的输出是:

minus one = -1 
one = 1 
very much = 2147483647 
nothing = 0 
zero = 0 
null = 0 
+0

你能帮我吗?我无法以上述方式获得他们 – Azfar 2012-03-13 10:29:43

+0

如果我有多个0,该怎么办?我将无法使用“返回i1.comapreTo(i2)”,因为它不允许我复制。我正在使用if(val1 Azfar 2012-03-13 10:49:29

+0

并且我排序不在他们的钥匙上,而是在他们的“值”上 – Azfar 2012-03-13 10:50:40