2014-06-13 145 views
3

我有个SortedMap具有相似的项目:比较器的比较()函数从地图删除重复

  • 1 = ABC
  • 2 = XYZ
  • 3 = ABC

值可以重复。

我想按排序的方式在屏幕上显示值集。即

myListMap

  • ABC
  • ABC
  • XYZ

要,我使用comparator排序Map

public class SortMapByValueComparator implements Comparator<String> { 

    Map<String, String> mInputMap; 

    /** 
    * Constructor. 
    * 
    * @param inputMap 
    */ 
    public SortMapByValueComparator(Map<String, String> inputMap) { 
     mInputMap = inputMap; 
    } 

    @Override 
    public int compare(String lhs, String rhs) { 
     String string1 = mInputMap.get(lhs); 
     String string2 = mInputMap.get(rhs); 
     return string1.compareToIgnoreCase(string2); 
    } 

} 

然后通过映射到此比较像:

SortMapByValueComparator sortMapByValueComparator = new SortMapByValueComparator(myListMap); 
SortedMap<String, String> sortedMapByValue = new TreeMap<String, String>(sortMapByValueComparator); 
sortedMapByValue.putAll(myListMap); 

现在的问题是,当我打电话SortMapByValueComparator,它会删除重复值。我怎样才能避免它?

PS - 我只想使用Map。

+0

“值可以重复。”和 “我想按排序的方式显示屏幕上的值集”是矛盾的陈述。 – TheLostMind

+0

@TheLostMind对于相同的值,我不关心哪个abc首先到达,只要两个都显示 – reiley

回答

3

的问题是,compareToIgnoreCase()将返回0,当两个字符串相等,返回零正在合并密钥,因为它解释为here。以零不返回的方式实现您的比较,它应该工作正常。

if(string1.compareToIgnoreCase(string2) >= 0) 
    return 1; 
else 
    return -1; 
+0

是的,为此如果compareTo == 0,我是returnig -1。只是不确定-1在这里是否合适。 – reiley

+0

如果返回1,则返回-1只是反转方式 – anvarik

1

我会改变整个方法,并用简单的东西去:

// initializing your Map 
// not sure if key set is Integer or String but it doesn't really matter here 
Map<Integer, String> tm = new TreeMap<Integer, String>(); 
tm.put(1, "abc"); 
tm.put(2, "xyz"); 
tm.put(3, "abc"); 
// getting the values as List (not Set, so duplicates allowed) 
List<String>values = new ArrayList<String>(tm.values()); 
System.out.printf("Unsorted values: %s%n", values); 
// sorting the values with natural (lexicographic) order... 
Collections.sort(values); 
System.out.printf("Sorted values: %s%n", values); 

输出

Unsorted values: [abc, xyz, abc] 
Sorted values: [abc, abc, xyz] 
+0

恩......你是对的,但是,我也想保留具有相应值的id(键) – reiley

+1

@reiley所以你想[按值排序你的地图](http://stackoverflow.com/questions/109383/how-to-sort-a-mapkey-value-on-the-values-in-java)? – Mena

+0

为了保留键值关系,您可以简单地通过Entry的值对map的entrySet进行排序,如下所示:http://stackoverflow.com/a/2581754 – Marco13