2012-03-19 54 views
-1

我有一个包含一个字符串和一个整数的散列图,该字符串是一个文件名,整数是一个与该特定图像相关的值。我需要按照数字顺序对散列图进行排序,以便我有一个从最低编号的文件到最高编号的文件的列表。 我将如何去做这件事?组织一个hashmap

任何帮助,将不胜感激

+0

问题是什么?你试过了什么?所有的工作对我来说“种类的游戏? – 2012-03-19 16:13:32

+0

http://docs.oracle.com/javase/tutorial/collections/interfaces/sorted-map.html – BalusC 2012-03-19 16:13:54

+0

你不能排序哈希图 – Tom 2012-03-19 16:15:35

回答

2

你使用TreeMap试过吗?

+0

组织地图,树图将如何帮助他?他按价值排序,而不是键 – bharal 2012-03-19 16:43:35

+0

有一个构造函数接受一个比较器,它可以帮助他通过另一个值进行排序。 – Davidann 2012-03-19 17:13:08

+0

嗯,真的,除了构造函数是(Comparator c)(其中K是Key的符号)并且doco读取:插入到映射中的所有键必须可以通过给定的比较器相互比较...... – bharal 2012-03-19 17:44:55

0

下面的代码需要像你谈论的hashmap,把它放在自定义值(Entry)的列表中,并按照你想要的排序它们。

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
public class Test { 
public static void main(String args[]) { 
    HashMap<String, Integer> hashmap = new HashMap<String, Integer>(); 
    hashmap.put("key1", 38); 
    hashmap.put("key8", 384); 
    hashmap.put("key3", 3); 
    hashmap.put("key5", 8); 
    hashmap.put("key36", 389); 
    hashmap.put("key199", 99); 
    class Entry { 
     public Entry(String filename, Integer value) { 
      this.filename = filename; 
      this.value = value; 
     } 
     private String filename; 
     private Integer value; 
     public String getFilename() { 
      return filename; 
     } 
     public Integer getValue() { 
      return value; 
     } 
     public String toString() { 
      return filename + " | " + value; 
     } 
    } 
    List<Entry> list = new ArrayList<Entry>(); 
    for(Map.Entry<String, Integer> entry : hashmap.entrySet()) { 
     list.add(new Entry(entry.getKey(), entry.getValue())); 
    } 
    Comparator<Entry> comparator = new Comparator<Entry>() { 
     @Override 
     public int compare(Entry entry0, Entry entry1) { 
      return entry0.getValue().compareTo(entry1.getValue()); 
     } 
    }; 
    Collections.sort(list, comparator); 
    for(Entry entry : list) { 
     System.out.println(entry); 
    } 
} 
} 
0

你真的不需要将这一切全部存储在一个hashmap中,对吗?

与其他人所做的一样,我会建议TreeMap--除非您希望基于整数大小而不是字符串(或值,而不是键)来存储数据。

SO!接下来,您可能需要尝试几种方法:

  1. Oop!有人用入门套装上的比较器殴打我。好吧,我会跳过这个,并继续到

  2. 一个linkedHashMap由一个优先级队列支持。这可能很有趣?使用通用HashMap作为支持映射,构建一个将对象放入HashMap的类。诀窍是,每个关键字都是字符串 - 好吧,这不是一个窍门。但价值投入?这是一个窍门。该值将被插入到priorityqueue中。所以你需要同时使用一个HashMap和一个prioQueue,或者某种树。这样,每次尝试重新创建HashMap时都没有nlogn排序成本,而是会产生logn成本。

  3. 保留一个哈希映射以按字符串名称查找项目。保留某种具有字符串名称和整数成本的对象的prioQueue。保持两者同步。这在技术上应该与上述2一样有效。

(效率注 - 在这一个成本是棘手,2以上为nlogn,而1以上很可能只是被nlogn以及{你所有的更改,然后订购混账东西,从不再看一遍}或更多{你继续添加/删除它并查询订单,随着地图变大,这将变得非常昂贵}