有一个Map,里面存放着
{
{a,a_value},
{b,b_value},
{c,c_value},
{d,d_value},
{e,e_value},
{d2,d2_value},
{e2,e2_value},
{d3,d3_value},
{e3,e3_value}
现在有个要求,把上面的数据按以下的方式输出:
a:a_value
b:b_value
c:c_value
d:d_value
e:e_value
d:d2_value
e:e2_value
d:d3_value
PS:不能使用IdentityHashMap和Map.Entry
[code="java"]Map map=new TreeMap(new Comparator(){
public int compare(Object o1, Object o2) {
String str1=(String)o1;
String str2=(String)o2;
if(str1.length()==1&&str2.length()==1){
return str1.compareTo(str2);
}
if(str1.length()==2&&str2.length()==2){
char char1=str1.charAt(1);
char char2=str2.charAt(1);
if(char1!=char2){
return char1>char2?1:-1;
}else{
return str1.charAt(1)>str2.charAt(1)?1:-1;
}
}
return str1.length()>str2.length()?1:-1;
}
});[/code]
试试
用TreeMap排序
用LinkedHashMap,这样map就有序了
然后for(Iterator it = map.iterator; it.hasNext; )
不知道符不符合你的需求
循环排序一下
[quote]恩,谢谢你的解答,如果这道题换成用数组来实现的话可以吗?[/quote]
可以多维数组实现。
可以呀,加我QQ503229799
package com.text;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class testMap {
public static void main(String[] args) {
HashMap hm = new HashMap();
hm.put("a", "a_value");
hm.put("b", "b_value");
hm.put("c", "c_value");
hm.put("d", "d_value");
hm.put("e", "e_value");
hm.put("f", "f_value");
Set s = hm.keySet();
// for (Iterator iterator = s.iterator(); iterator.hasNext();) {
// String str = (String) iterator.next();
// System.out.println(str + ":" + hm.get(str));
// }
System.out.println(s.size());
String[] a = s.toArray(new String[s.size()]);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
System.out.println(a[i] + ":" + hm.get(a[i]));
}
}
}
我帮你写了2中方法 set集合都是无序的你需要排序下排序很简单我就不用写了
[code="java"]
import java.util.Arrays;
public class Record implements Comparable {
private final String id;
private final String value;
public Record(String id, String value) {
super();
this.id = id;
this.value = value;
}
public int compareTo(Record o) {
String id1 = id;
String id2 = o.id;
int n1 = id1.length();
int n2 = id2.length();
if (n1 > n2)
return 1;
else if (n1 < n2)
return -1;
for (int i = n1 - 1; i >= 0; i--) {
char ch1 = id1.charAt(i);
char ch2 = id2.charAt(i);
if (ch1 > ch2)
return 1;
else if (ch1 < ch2)
return -1;
}
return 0;
}
public String toString() {
return id + "," + value;
}
public static void main(String[] args) {
Record[] records = { new Record("a", "a_value"), new Record("b", "b_value"),
new Record("c", "c_value"), new Record("d", "d_value"), new Record("e", "e_value"),
new Record("d2", "d2_value"), new Record("e2", "e2_value"),
new Record("d3", "d3_value"), new Record("e3", "e3_value") };
Arrays.sort(records);
for (Record r : records) {
System.out.println(r);
}
}
[/code]
其实这么简单的问题,都够不上称之为“算法”
[quote]目前我是使用以下的做法来实现重复Key的Map,但是觉得性能不忧,想找些比较高效的算法实现。[/quote]
假如你想高效,就别老用map,用多维数组可以解决,但是这个和你初衷想法应该不太一样。
其实java的数据结构已经被封装成这样了,性能上其实提高空间不是太大了。
[quote]MAP是在接口上已经定死了,我目前是想把发过来的map里面的数据取出来放进到数组里面处理。[/quote]
那你必然得有循环map到数组的过程 这个也算是性能影响的一部分了。
[quote]题意要的不是排序,是需要你把一个MAP中近似的KEY在VALUE不变的情况下转化成相似的KEY进行顺序输出[/quote]
你不排序,又怎么顺序输出?!
我的代码已经可以把map转成Record类型数值,直接排序,应该算快的了。