2013-02-09 27 views
1

首先,我不得不说,我确实广泛地搜索了一个答案,但我无法找到它。Collections.sort with anonymous Comparable提供了一个错误

基本上我使用与其他网站使用吨完全相同的格式,但我的NetBeans给这个错误。

我的代码:

package ocr; 

public class Property {  
    public static final int METHOD_NORMAL_SEARCH = 1; 
    public static final int METHOD_ADVANCED_SEARCH = 2; 

    private String property; 
    private ArrayList<String> names; 
    protected HashMap<String, Integer> values; 

    public Property(String propertyName, ArrayList<String> names) { 
     this.property = propertyName; 
     this.names = new ArrayList<>(); 
     this.values = new HashMap<>(); 
     for (String s : names) { 
      this.names.add(s); 
     } 
    } 

    public void add(String value, int method) { 
     values.put(value, method); 
    } 

    public int calculateSimilarity(String value) { 
     if (names.isEmpty()) { 
      throw new IllegalArgumentException("names cannot be empty."); 
     } 
     LevenshteinDistance ld = new LevenshteinDistance(); 
     ArrayList<Integer> list = new ArrayList<>(); 
     for (String n : names) { 
      list.add(ld.calculate(value, n)); 
     } 
     Collections.sort(list); 
     return list.get(0); 
    } 

    public void search(File input) { 
     HashMap<String, Values> table = new HashMap<>(); //Maps word to {similarity, location in file} 
     CustomScanner scanner = new CustomScanner(input); 

     while (scanner.hasNext()) { 
      String next = scanner.next(); 
      table.put(next, new Values(calculateSimilarity(next), scanner.getPosition())); 
     } 

     //Sorting on similarity 
     Collections.sort(table, new Comparator<Values>() { 
      @Override public int compare(Values val1, Values val2) { 
       return Integer.signum(val1.similarity - val2.similarity); 
      } 
     }); 
    } 

    public void advancedSearch(File input) { 

    } 

    public void print() { 
     System.out.println("--" + property + "--"); 
     for (Map.Entry<String, Integer> entry : values.entrySet()) { 
      System.out.println("Value: " + entry.getKey() + "/Method: " + entry.getValue()); 
     } 
    } 

    private class Values { 
     private int similarity; 
     private int position; 

     public Values(Integer similarity, Integer position) { 
      this.similarity = similarity; 
      this.position = position; 
     } 

     public int getSimilarity() { 
      return similarity; 
     } 

     public int getPosition() { 
      return position; 
     } 
    } 
} 

这是我得到的错误:

C:\Users\Frank\Documents\NetBeansProjects\OCR\src\ocr\Property.java:62: error: no suitable method found for sort(HashMap<String,Property.Values>,<anonymous Comparator<Property.Values>>) 
     Collections.sort(table, new Comparator<Values>() { 
    method Collections.<T#1>sort(List<T#1>,Comparator<? super T#1>) is not applicable 
     (no instance(s) of type variable(s) T#1 exist so that argument type HashMap<String,Property.Values> conforms to formal parameter type List<T#1>) 
    method Collections.<T#2>sort(List<T#2>) is not applicable 
     (cannot instantiate from arguments because actual and formal argument lists differ in length) 
    where T#1,T#2 are type-variables: 
    T#1 extends Object declared in method <T#1>sort(List<T#1>,Comparator<? super T#1>) 
    T#2 extends Comparable<? super T#2> declared in method <T#2>sort(List<T#2>) 
1 error 

所有其他方面的建议显然是欢迎以及。

我要么真的没有注意到一些明显的错误,要么会在这里发生一些更难的问题。

回答

5

Collection.sort不适用于MapCollections#sort功能只得到了ListMap未实现此接口。如果您需要对Map物品进行分类,请考虑使用TreeMap而不是HashMap

+0

是否有可能让我更深入了解如何使它成为TreeMap,只需将HashMap更改为TreeMap就可能是一种太简单的思考方式。 另外,你们(人们回答我)会如何解决这样的问题? 你有一个表: 键(字符串) - 值1(整数) - 值2(整数) 而你想要它在Value1上排序,同时明显保留Key-Value1-Value2之间的关系。 任何帮助,这将不胜感激。 – skiwi 2013-02-09 15:19:38

+0

对不起,它使用编辑令人讨厌,但我不能回应我自己的问题呢:旁注:奇怪,我无法找到自己,你不能排序HashMap?我的意思是既没有错误,也没有NetBeans,也没有谷歌的结果让我相信这可能是问题。 – skiwi 2013-02-09 15:19:58

+0

最后编辑:我刚把HashMap 改成ArrayList ,其中Values的形式为{String,Integer,Integer},这似乎表现得很好。谢谢你所有的答案。 – skiwi 2013-02-09 15:23:35

6

您无法对HashMap进行排序。这个不成立。列表可以排序。数组可以被排序。但不是一个HashMap。