请教一个如何在hashmap中查找以特定字符串开头的键值!

cheriss 2008-03-28 02:04:01
假设有如下的HashMap:
HashMap hash = new HashMap();
hash.put('1$1$1$1', obj1);
hash.put('1$1$1$2', obj2);
hash.put('1$1$2$1', obj3);
hash.put('1$1$2$2', obj4);
hash.put('1$2$1$1', obj5);
hash.put('2$2$1$1', obj6);
正常情况下能够通过hash.get('2$2$1$1')来获得对应的obj6,
那我现在的问题是如果只传个'1$'而获得'1$1$1$1','1$1$1$2','1$1$2$1','1$2$1$1'
所对应的所有对象,有点像模糊查询的意思1$%.
请教有什么便捷的方法没有,谢谢!
如果这里是一个数组['1$1$1$1','1$1$1$2','1$1$2$1','1$2$1$1','2$2$1$1']
如何取到以'1$1$'开头的项呢?


...全文
616 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
抗议,13 楼的抄袭!
ray198471 2008-03-31
  • 打赏
  • 举报
回复
不错不错。都好强呀!!!
cheriss 2008-03-31
  • 打赏
  • 举报
回复
好的,谢谢楼上各位给的意见了!结帖了!
hmsuccess 2008-03-28
  • 打赏
  • 举报
回复
严禁copy,楼上的什么意思???
chenhongxin 2008-03-28
  • 打赏
  • 举报
回复
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class Test {

public static void main(String args[]) {
Map<String, String> map = new TreeMap<String, String>();
map.put("1$1$1$1", "obj1");
map.put("1$1$1$2", "obj2");
map.put("1$1$2$1", "obj3");
map.put("1$1$2$2", "obj4");
map.put("1$2$1$1", "obj5");
map.put("2$2$1$1", "obj6");

List<String> list = get(map, "1$1$1");
for(String s : list) {
System.out.println(s);
}
}

public static <T> List<T> get(Map<String, T> map, String key) {
String[] strs = map.keySet().toArray(new String[0]);
List<T> list = new ArrayList<T>();
boolean isFound = false;
for(int i = 0; i < strs.length; i++) {
if(strs[i].startsWith(key)) {
list.add(map.get(strs[i]));
isFound = true;
}else if(isFound){
break;
}
}
return list;
}
}
hmsuccess 2008-03-28
  • 打赏
  • 举报
回复
难道是用TreeMap(SortedMap<K,? extends V> m)
healer_kx 2008-03-28
  • 打赏
  • 举报
回复
我开玩笑的,。。。。楼上的,我的意思是说,你遍历的话,不如让Java的JVM去遍历。再比如就是Copy文件,你用流去读写,怎么也赶不上OS的速度啊。
编程,很多时候要借助OS,JVM的能力,而不是自己写。要知道,Java不是C++。C++的一个设计原则就是让用户设计出来的类型和自建类型具有同样的等级,而Java不具有这样的设计原则,于是,你写的一个循环,写的一个类,基本上是无法超越Java本身所提供的类的。让JVM自己转去。


zr_dixuexiongying 2008-03-28
  • 打赏
  • 举报
回复
顶,都可以,但感觉3楼的执行效率更高些
zr_dixuexiongying 2008-03-28
  • 打赏
  • 举报
回复
顶,都可以,但感觉楼上的执行效率更高些
hmsuccess 2008-03-28
  • 打赏
  • 举报
回复
学习了,“你应该尽量把操作权交给Java,而不是自己去遍历”什么意思
healer_kx 2008-03-28
  • 打赏
  • 举报
回复
100分我告诉你。。。 。。。
cheriss 2008-03-28
  • 打赏
  • 举报
回复
那请教healer_kx有什么好的方法么?谢谢!
healer_kx 2008-03-28
  • 打赏
  • 举报
回复
这种问题,你应该尽量把操作权交给Java,而不是自己去遍历,于是你的TreeMap的类型应该改一改。
cheriss 2008-03-28
  • 打赏
  • 举报
回复
看来也是,只能去遍历了,就是不知道效率如何?
  • 打赏
  • 举报
回复
用 TreeMap 做了一个

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class Test {

public static void main(String args[]) {
Map<String, String> map = new TreeMap<String, String>();
map.put("1$1$1$1", "obj1");
map.put("1$1$1$2", "obj2");
map.put("1$1$2$1", "obj3");
map.put("1$1$2$2", "obj4");
map.put("1$2$1$1", "obj5");
map.put("2$2$1$1", "obj6");

List<String> list = get(map, "1$1$1");
for(String s : list) {
System.out.println(s);
}
}

public static <T> List<T> get(Map<String, T> map, String key) {
String[] strs = map.keySet().toArray(new String[0]);
List<T> list = new ArrayList<T>();
boolean isFound = false;
for(int i = 0; i < strs.length; i++) {
if(strs[i].startsWith(key)) {
list.add(map.get(strs[i]));
isFound = true;
}else if(isFound){
break;
}
}
return list;
}
}
吴冬冬 2008-03-28
  • 打赏
  • 举报
回复
Set set=hash.keySet();
for(Object key : set){
if(key.toString().startsWith("1$"))
System.out.println(hash.get(key));
}
dracularking 2008-03-28
  • 打赏
  • 举报
回复
这和HashMap无关 你只要遍历比较就可以了
字符串有个
startsWith(String prefix)
方法

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧