【问题标题】:What is comparable type casting & Map.Entry?什么是可比类型转换和 Map.Entry?
【发布时间】:2014-04-04 07:37:13
【问题描述】:

我是 Java 新手。 我正在实现 Comparator 接口,并且我在下面有一个 compareTo 函数:-

public int compare(Object o1, Object o2) {
    Map.Entry e1 = (Map.Entry) o1;
    Map.Entry e2 = (Map.Entry) o2;
    return ((Comparable) e1.getValue()).compareTo(e2.getValue());
}

我无法理解这条线是什么意思

Map.Entry e1 = (Map.Entry) o1;

两个Map.Entry有什么用??

为什么Comparable 在类型转换中??

有人请给我一个参考,以便我弄清楚。 谢谢。

编辑:- 这是我的整个班级,我有一个 HashMap 我想使用通用类按值排序,因此编写了这个类

package via;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class SortMap<K, V> {
    public Map<K, V> getSortedMap(Map<K, V> mapToSort) {
        List<Map.Entry> list = new ArrayList<Map.Entry>(mapToSort.entrySet());
        Collections.sort(list, new Comparator() {

            @Override
            public int compare(Object o1, Object o2) {
                Map.Entry e1 = (Map.Entry) o1;
                Map.Entry e2 = (Map.Entry) o2;
                return ((Comparable) e2.getValue()).compareTo(e1.getValue());
            }

        });
        Map sortedMap = new LinkedHashMap();
        for(Iterator i=list.iterator();i.hasNext();)
        {
            Map.Entry entry=(Map.Entry)i.next();
            sortedMap.put(entry.getKey(), entry.getValue());
        }
        System.out.println(list);
        return sortedMap;
    }

}

【问题讨论】:

  • 你能发布完整的课程吗?你应该实现参数化的Comparator 而不是原始类型。
  • 看起来你正在实现 raw Comparator 接口 - 有什么理由你没有将它实现为 Comparator&lt;Map.Entry&lt;String, String&gt;&gt; 或其他什么?
  • 正如我之前提到的,我是 Java 新手,所以不知道这里发生了什么。我对此一无所知。
  • 如果您是 Java 新手,请尝试一些简单的比较器/可比较示例。谷歌上有很多。
  • @T.J.Crowder 我想比较 Map.Entry 实例。

标签: java interface compare comparator compareto


【解决方案1】:

我在这里考虑,K,V 都是字符串值。如果您有其他一些值,那么首先您的 K,V 类应遵循 equals()hashcode() 规则。 如果您遵循以下程序,则不需要 Comparable。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class SortMap {
    public Map<String, String> getSortedMap(Map<String, String> mapToSort) {
        Set<Map.Entry<String,String>> mapEntry = mapToSort.entrySet();

        List<Map.Entry<String,String>> listMap= new ArrayList<Map.Entry<String,String>>();
        listMap.addAll(mapEntry);
        Collections.sort(listMap, new Comparator<Map.Entry<String,String>>() {

            @Override
            public int compare(Map.Entry<String,String> o1, Map.Entry<String,String> o2) {
                return  o1.getValue().compareTo(o2.getValue());
            }

        });
        Map<String,String> sortedMap = new LinkedHashMap<String,String>();
        for(Map.Entry<String,String> mapE:listMap)
        {
            sortedMap.put(mapE.getKey(), mapE.getValue());
        }
        System.out.println(sortedMap);
        return sortedMap;
    }

}

Map.Entry 只不过是写在 HashMap 类中的 Entry 类,它实现了编写的 Entry 接口地图界面内。所以有使用内部类引用的规则。

static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;
        final int hash;

        /**
         * Creates new entry.
         */
        Entry(int h, K k, V v, Entry<K,V> n) {
            value = v;
            next = n;
            key = k;
            hash = h;
        }
}

【讨论】:

  • 与我之前接触过的方式相同。它没有提供 compareTo 函数来比较对象值。
  • 因为该引用属于Object 类型,并且没有compareTo 方法。
猜你喜欢
  • 2016-04-02
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 2011-05-02
相关资源
最近更新 更多