【问题标题】:How to get a HashMap value and compare it to a number如何获取 HashMap 值并将其与数字进行比较
【发布时间】:2013-08-21 23:46:38
【问题描述】:

我有一个 HashMap 中的条目列表,一个 String 作为 Key,一个 Long 作为 Value。我正在尝试检查 Value 是否大于某个数字,但我不确定如何获取该值并进行检查。

我知道这是不正确的,但这可能比我能解释的更能说明我的意思:

long offlineTimeLimit = (offlineTimeLimitConfig*1000);
long limit = (offlineTimeLimit + System.currentTimeMillis());
Long playerName = playerTimeCheck.get(p);

if (playerTimeCheck.containsValue( > limit)) {
}

这会获取允许玩家离线的时间量 offlimeTimeLimitConfig,然后乘以 1000(因此以毫秒为单位),然后加上当前时间。我想检查hashmap中是否有任何值大于当前时间加上时间限制,然后执行代码。

我一直在做研究,并找到了存储数据的其他方法(例如 TreeMap),但我不确定这是否是存储数据的更好方法。

下面是剩下的代码:

String p = event.getPlayer().getName();
HashMap<String, Long> playerTimeCheck = new HashMap<String, Long>();
ConfigurationSection section = getConfig().getConfigurationSection("PlayerTime");
long currentTime = System.currentTimeMillis();
String playerCheck = getConfig().getString("PlayerTime");

for (String key : section.getKeys(false)) {
            playerTimeCheck.put(key, section.getLong(key));
        }

感谢您的帮助, 科尔比

【问题讨论】:

  • 您只需要知道地图中的任何值是否大于某个数字?我只会使用树形图,按降序排序,然后检查第一项的值是否 > 您的值...
  • @jcampos8782 树形图是按键排序的,这里不起作用。
  • 哦,是的,没错...只需使用按值排序的比较器:stackoverflow.com/questions/1448369/…

标签: java hashmap compare contains treemap


【解决方案1】:
Map<String,Long> playerTimeChcek = new TreeMap<>(new ValueComparator());
...

if(!playerTimeCheck.isEmpty() && playerTimeCheck.firstEntry().getValue() > limit) {
    ...
}

然后只需实现值比较器类,如 How to sort a treemap based on its values? 所示

【讨论】:

    【解决方案2】:

    TreeMap 是按键排序的,但是你可以提供一个比较器。见How to sort a Map on the values

    下面的代码是将映射转换为按值排序的linkedHashMap。

    public static <K, V> LinkedHashMap<K, V> sort(Map<K, V> map,
            final Comparator<Entry<K, V>> comparator) {
        List<Entry<K, V>> list = Lists.newArrayList(map.entrySet());
    
        Collections.sort(list, comparator);
        LinkedHashMap<K, V> sortedMap = new LinkedHashMap<K, V>();
        for (Entry<K, V> entry : list) {
            sortedMap.put(entry.getKey(), entry.getValue());
        }
        return sortedMap;
    }
    

    这里使用的比较器:

    Comparator<Entry<String, Integer>> comparator = new Comparator<Entry<String, Integer> () {
    
                    @Override
                    public int compare(Entry<String, Integer> o1,
                            Entry<String, Integer> o2) {
                        return o1.getValue().compareTo(o2.getValue());
                    }
                }
    

    或者只是使用这个:

    public static <K, V> LinkedHashMap<K, V> sort(Map<K, V> map) {
        List<Entry<K, V>> list = Lists.newArrayList(map.entrySet());
    
        Collections.sort(list, new Comparator<Entry<K, V>>() {
    
            @SuppressWarnings("unchecked")
            @Override
            public int compare(Entry<K, V> o1, Entry<K, V> o2) {
                return ((Comparable<V>) o1.getValue()).compareTo(o2.getValue());
            }
        });
        LinkedHashMap<K, V> sortedMap = new LinkedHashMap<K, V>();
        for (Entry<K, V> entry : list) {
            sortedMap.put(entry.getKey(), entry.getValue());
        }
        return sortedMap;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多