请教 hashmap 转 set 的一个问题。 本帖最后由 blackkettle 于 2012-11-12 15:44:25 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 HashMap<Integer, Double[]> hs=new HashMap<Integer, Double[]>();...Set<Double[]> s = new HashSet<Double[]>();s.add(hs.get(Integer.valueOf(1));... 怎么对 hs进行遍历呢?这样可以把s.add(hs.get(Integer.valueOf(1));写在一个 for循环里。 用Iterator,可以对key或value或Map.Entry进行遍历 zxhcloth,您直接给个例子好不好?import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;public class HashMap_01 { public static void main(String args[]) { HashMap<Integer, Double[]> hm1 = new HashMap<Integer, Double[]>(); hm1.put(1, new Double[] { 100.0, 200.0 }); hm1.put(2, new Double[] { 110.0, 300.0, 200.0 }); hm1.put(3, new Double[] { 120.0, 400.0, 300.0 }); hm1.put(4, new Double[] { 130.0, 500.0 }); hm1.put(5, new Double[] { 140.0, 600.0 }); Set<Map.Entry<Integer, Double[]>> set = new HashSet<Map.Entry<Integer, Double[]>>();for() set.add(); }}怎么用 for循环把 hm1里的数据添加到 set里?十分感谢! public static interface Map.Entry<K,V>映射项(键-值对)。Map.entrySet 方法返回映射的 collection 视图,其中的元素属于此类。获得映射项引用的唯一 方法是通过此 collection 视图的迭代器来实现。这些 Map.Entry 对象仅 在迭代期间有效;更确切地讲,如果在迭代器返回项之后修改了底层映射,则某些映射项的行为是不确定的,除了通过 setValue 在映射项上执行操作之外。 import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.Map;import java.util.Set;public class HashMap_01 { public static void main(String args[]) { HashMap<Integer, Double[]> hm1 = new HashMap<Integer, Double[]>(); hm1.put(1, new Double[] { 100.0, 200.0 }); hm1.put(2, new Double[] { 110.0, 300.0, 200.0 }); hm1.put(3, new Double[] { 120.0, 400.0, 300.0 }); hm1.put(4, new Double[] { 130.0, 500.0 }); hm1.put(5, new Double[] { 140.0, 600.0 }); Set<Map.Entry<Integer, Double[]>> set = new HashSet<Map.Entry<Integer, Double[]>>(); Iterator<Map.Entry<Integer, Double[]>> iter = hm1.entrySet().iterator(); while (iter.hasNext()) { Map.Entry<Integer, Double[]> entry = (Map.Entry<Integer, Double[]>) iter .next(); if (entry.getValue()[0] > 100) set.add(entry); } for (Map.Entry<Integer, Double[]> e : set) { System.out.println(e.getKey() + " " + e.getValue()[0] + " " + e.getValue()[1]); } }}看来一定要先entrySet()才行。不能绕过么? 楼主,你这个应该是先keySet(),然后在get(key)吧?不然key就木有用处了! Set<Double[]> valueSet = new HashSet<Double[]>(); Set<Integer> keySet = hm1.keySet(); Iterator<Integer> keyIt = keySet.iterator(); while(keyIt.hasNext()) { valueSet.add(hm1.get(keyIt.next())); }那段应该改成这样,代码还能简洁一些。而且这里用HashSet有隐患,不允许有重复项,不然就会把重复的给过滤掉。如果可以的话,还是使用ArrayList比较高效。 哦,那我改成 ArrayList 再试试 import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator;import java.util.Set;public class HashMap_02 { public static void main(String args[]) { ArrayList<Double[]> hm1 = new ArrayList<Double[]>(); hm1.add(new Double[] { 100.0, 200.0 }); hm1.add(new Double[] { 110.0, 300.0, 200.0 }); hm1.add(new Double[] { 120.0, 400.0, 300.0 }); hm1.add(new Double[] { 130.0, 500.0 }); hm1.add(new Double[] { 140.0, 600.0 }); Set<Double[]> set = new HashSet<Double[]>(); Iterator<Double[]> iter = hm1.iterator(); while (iter.hasNext()) { if (iter.next()[0] > 100) set.add(iter.next()); } for (Double[] e : set) { for (int i = 0; i < e.length; i++) System.out.print(e[i] + " "); System.out.println(""); } }}tiwerbao, 这样写是不是好些? 这样也行,那不如全部都改成List算了,就不用set,还方便些 import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator;import java.util.Set;public class ArrayList_02 { public static void main(String args[]) { ArrayList<Double[]> hm1 = new ArrayList<Double[]>(); hm1.add(new Double[] { 100.0, 200.0 }); hm1.add(new Double[] { 110.0, 300.0, 200.0 }); hm1.add(new Double[] { 120.0, 400.0, 300.0 }); hm1.add(new Double[] { 130.0, 500.0 }); hm1.add(new Double[] { 140.0, 600.0 }); ArrayList<Double[]> set = new ArrayList<Double[]>(); Iterator<Double[]> iter = hm1.iterator(); while (iter.hasNext()) { Double[] entry = iter.next(); if (entry[0] > 100) set.add(entry); } for (Double[] e : set) { for (int i = 0; i < e.length; i++) System.out.print(e[i] + " "); System.out.println(""); } }}tiwerbao, 你的意思是直接这样写? 嗯,就是这么写。另外你最后的for循环输出,可以改成iterator循环,这样更高效(JDK里面基本上都是用iterator循环的),另外在并发的环境下也更加安全一些。 那就像下面这样写?import java.util.ArrayList;import java.util.Iterator;public class ArrayList_03 { public static void main(String args[]) { ArrayList<Double[]> hm1 = new ArrayList<Double[]>(); hm1.add(new Double[] { 100.0, 200.0 }); hm1.add(new Double[] { 110.0, 300.0, 200.0 }); hm1.add(new Double[] { 120.0, 400.0, 300.0 }); hm1.add(new Double[] { 130.0, 500.0 }); hm1.add(new Double[] { 140.0, 600.0 }); ArrayList<Double[]> set = new ArrayList<Double[]>(); Iterator<Double[]> iter = hm1.iterator(); while (iter.hasNext()) { Double[] entry = iter.next(); if (entry[0] > 100) set.add(entry); } iter = set.iterator(); while (iter.hasNext()) { Double[] e = iter.next(); for (int i = 0; i < e.length; i++) System.out.print(e[i] + " "); System.out.println(""); } }} 嗯,这样可以的。然后你可以把hm1的ArrayList定义成List,一个是面向接口编程,另外一个也能提高扩展性。ArrayList<Double[]> hm1 = new ArrayList<Double[]>();另外,如果你这个list只是用来遍历读取的话,可以先转化成array,这样遍历的速度会更快一些。如最后的那个遍历可以写成:Double[][] dss = new Double[set.size()][]; set.toArray(dss); for (Double[] ds : dss ) { for (double d : ds) { System.out.print(d + " "); } System.out.println(""); }只是举个例子,楼主看具体情况而用吧。 myeclipse中编写Javascript代码问题。。。 计算a++的问题.. JNI 中调用DefineClass函数出错 为什么我的程序弹不出对话框? 继续帮助 怎么实现:第一个格子装入的数据范围为:1-29; 高概率区:1-7 怎么样在JCREATEOR中运行J2ME程序 ?? 初学Java :关于 switch case 问题 java程序问题 ?如何做菜单[Edit]->[Cut],使 [cut]动作支持 Ctrl + X ? 关于一些常见的的参数 一个排列问题
...
Set<Double[]> s = new HashSet<Double[]>();
s.add(hs.get(Integer.valueOf(1));
...
怎么对 hs进行遍历呢?这样可以把
s.add(hs.get(Integer.valueOf(1));写在一个 for循环里。
zxhcloth,您直接给个例子好不好?import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;public class HashMap_01 {
public static void main(String args[]) { HashMap<Integer, Double[]> hm1 = new HashMap<Integer, Double[]>(); hm1.put(1, new Double[] { 100.0, 200.0 });
hm1.put(2, new Double[] { 110.0, 300.0, 200.0 });
hm1.put(3, new Double[] { 120.0, 400.0, 300.0 });
hm1.put(4, new Double[] { 130.0, 500.0 });
hm1.put(5, new Double[] { 140.0, 600.0 }); Set<Map.Entry<Integer, Double[]>> set = new HashSet<Map.Entry<Integer, Double[]>>();
for()
set.add();
}
}怎么用 for循环把 hm1里的数据添加到 set里?十分感谢!
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;public class HashMap_01 {
public static void main(String args[]) {
HashMap<Integer, Double[]> hm1 = new HashMap<Integer, Double[]>(); hm1.put(1, new Double[] { 100.0, 200.0 });
hm1.put(2, new Double[] { 110.0, 300.0, 200.0 });
hm1.put(3, new Double[] { 120.0, 400.0, 300.0 });
hm1.put(4, new Double[] { 130.0, 500.0 });
hm1.put(5, new Double[] { 140.0, 600.0 }); Set<Map.Entry<Integer, Double[]>> set = new HashSet<Map.Entry<Integer, Double[]>>(); Iterator<Map.Entry<Integer, Double[]>> iter = hm1.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<Integer, Double[]> entry = (Map.Entry<Integer, Double[]>) iter
.next();
if (entry.getValue()[0] > 100)
set.add(entry);
} for (Map.Entry<Integer, Double[]> e : set) {
System.out.println(e.getKey() + " " + e.getValue()[0] + " "
+ e.getValue()[1]);
}
}
}看来一定要先entrySet()才行。不能绕过么?
楼主,你这个应该是先keySet(),然后在get(key)吧?不然key就木有用处了!
Set<Double[]> valueSet = new HashSet<Double[]>();
Set<Integer> keySet = hm1.keySet();
Iterator<Integer> keyIt = keySet.iterator();
while(keyIt.hasNext()) {
valueSet.add(hm1.get(keyIt.next()));
}
那段应该改成这样,代码还能简洁一些。
而且这里用HashSet有隐患,不允许有重复项,不然就会把重复的给过滤掉。
如果可以的话,还是使用ArrayList比较高效。
哦,那我改成 ArrayList 再试试
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class HashMap_02 {
public static void main(String args[]) { ArrayList<Double[]> hm1 = new ArrayList<Double[]>(); hm1.add(new Double[] { 100.0, 200.0 });
hm1.add(new Double[] { 110.0, 300.0, 200.0 });
hm1.add(new Double[] { 120.0, 400.0, 300.0 });
hm1.add(new Double[] { 130.0, 500.0 });
hm1.add(new Double[] { 140.0, 600.0 }); Set<Double[]> set = new HashSet<Double[]>();
Iterator<Double[]> iter = hm1.iterator();
while (iter.hasNext()) {
if (iter.next()[0] > 100)
set.add(iter.next());
} for (Double[] e : set) {
for (int i = 0; i < e.length; i++)
System.out.print(e[i] + " ");
System.out.println("");
}
}
}tiwerbao, 这样写是不是好些?
这样也行,那不如全部都改成List算了,就不用set,还方便些
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class ArrayList_02 {
public static void main(String args[]) { ArrayList<Double[]> hm1 = new ArrayList<Double[]>(); hm1.add(new Double[] { 100.0, 200.0 });
hm1.add(new Double[] { 110.0, 300.0, 200.0 });
hm1.add(new Double[] { 120.0, 400.0, 300.0 });
hm1.add(new Double[] { 130.0, 500.0 });
hm1.add(new Double[] { 140.0, 600.0 }); ArrayList<Double[]> set = new ArrayList<Double[]>();
Iterator<Double[]> iter = hm1.iterator();
while (iter.hasNext()) {
Double[] entry = iter.next();
if (entry[0] > 100)
set.add(entry);
} for (Double[] e : set) {
for (int i = 0; i < e.length; i++)
System.out.print(e[i] + " ");
System.out.println("");
}
}
}
tiwerbao, 你的意思是直接这样写?
嗯,就是这么写。
另外你最后的for循环输出,可以改成iterator循环,这样更高效(JDK里面基本上都是用iterator循环的),另外在并发的环境下也更加安全一些。
那就像下面这样写?import java.util.ArrayList;
import java.util.Iterator;public class ArrayList_03 {
public static void main(String args[]) { ArrayList<Double[]> hm1 = new ArrayList<Double[]>(); hm1.add(new Double[] { 100.0, 200.0 });
hm1.add(new Double[] { 110.0, 300.0, 200.0 });
hm1.add(new Double[] { 120.0, 400.0, 300.0 });
hm1.add(new Double[] { 130.0, 500.0 });
hm1.add(new Double[] { 140.0, 600.0 }); ArrayList<Double[]> set = new ArrayList<Double[]>();
Iterator<Double[]> iter = hm1.iterator();
while (iter.hasNext()) {
Double[] entry = iter.next();
if (entry[0] > 100)
set.add(entry);
} iter = set.iterator();
while (iter.hasNext()) {
Double[] e = iter.next();
for (int i = 0; i < e.length; i++)
System.out.print(e[i] + " ");
System.out.println("");
}
}
}
嗯,这样可以的。然后你可以把hm1的ArrayList定义成List,一个是面向接口编程,另外一个也能提高扩展性。ArrayList<Double[]> hm1 = new ArrayList<Double[]>();
另外,如果你这个list只是用来遍历读取的话,可以先转化成array,这样遍历的速度会更快一些。如最后的那个遍历可以写成:Double[][] dss = new Double[set.size()][];
set.toArray(dss);
for (Double[] ds : dss ) {
for (double d : ds) {
System.out.print(d + " ");
}
System.out.println("");
}
只是举个例子,楼主看具体情况而用吧。