小弟近来学习java中的集合,写了个map系列(所有继承mpa接口的集合类)集合的通过值来查找键(key)的方法,但是有错误,先看看代码吧
public class Select
{
public static Object[] mapValue(Map m,Object value)//通过值来查找键,可能返回多个值,
//因为,map中键不可以一样,但是值可以重复
/**
* 原理:由于map是一个键对应一个值,所以一个map中有多少个键,就有多少个值,用2个容器分别保存键和值,
* 然后遍历保存值的容器,如果传进来的参数和值相等,就取出当前容器的下标,
* 按照这个下标,从保存键的容器中取出相应的键
*/
{
if(m.containsValue(value))
{
Collection sKey=m.keySet();//用来保存键的集合
Collection sValue=m.values();//用来保存值的集合
Object o[]=null;//保存键的集合
Object o1[]=null;//保存值的集合
Object o2[]=null;//保存结果的集合
int q=0;
o=sKey.toArray();
o1=sValue.toArray();
System.out.println(o.length+"<---------->"+o1.length);
for(int i=0;i<o.length;i++)
{
System.out.println(o[i]+"----"+o1[i]);
}
for(int k=0;k<o.length;k++)
{
if(value.equals(o1[k]))//这个地方没写好
{
o2[q]=o[k];//结果显示这里有空引用
q=q+1;
}
}
return o2;
}
else
{
return null;
}
}下面是一个测试的代码
public class MyHashMap
{ public static void main(String[] args) throws Exception
{
HashMap hm=new HashMap();
Stu s1=new Stu(1,"张三");
Stu s2=new Stu(3,"李四");
Stu s3=new Stu(2,"王五");
Grade g1=new Grade(70,80);
Grade g2=new Grade(80,90);
Grade g3=new Grade(70,90);
hm.put(s1,g1);
hm.put(s2,g2);
hm.put(s3,g3);
System.out.println("--------------------");
System.out.println(Select.mapValue(hm,g1));
System.out.println("--------------------");
}
}
这个最后显示出来的结果应该是s1的对象
但是实际的结果是有空引用
请大家帮我看看呀
或者还有更好的办法通过值来查找键的也说说思路,我现在觉得我的这个思路有点错!
public class Select
{
public static Object[] mapValue(Map m,Object value)//通过值来查找键,可能返回多个值,
//因为,map中键不可以一样,但是值可以重复
/**
* 原理:由于map是一个键对应一个值,所以一个map中有多少个键,就有多少个值,用2个容器分别保存键和值,
* 然后遍历保存值的容器,如果传进来的参数和值相等,就取出当前容器的下标,
* 按照这个下标,从保存键的容器中取出相应的键
*/
{
if(m.containsValue(value))
{
Collection sKey=m.keySet();//用来保存键的集合
Collection sValue=m.values();//用来保存值的集合
Object o[]=null;//保存键的集合
Object o1[]=null;//保存值的集合
Object o2[]=null;//保存结果的集合
int q=0;
o=sKey.toArray();
o1=sValue.toArray();
System.out.println(o.length+"<---------->"+o1.length);
for(int i=0;i<o.length;i++)
{
System.out.println(o[i]+"----"+o1[i]);
}
for(int k=0;k<o.length;k++)
{
if(value.equals(o1[k]))//这个地方没写好
{
o2[q]=o[k];//结果显示这里有空引用
q=q+1;
}
}
return o2;
}
else
{
return null;
}
}下面是一个测试的代码
public class MyHashMap
{ public static void main(String[] args) throws Exception
{
HashMap hm=new HashMap();
Stu s1=new Stu(1,"张三");
Stu s2=new Stu(3,"李四");
Stu s3=new Stu(2,"王五");
Grade g1=new Grade(70,80);
Grade g2=new Grade(80,90);
Grade g3=new Grade(70,90);
hm.put(s1,g1);
hm.put(s2,g2);
hm.put(s3,g3);
System.out.println("--------------------");
System.out.println(Select.mapValue(hm,g1));
System.out.println("--------------------");
}
}
这个最后显示出来的结果应该是s1的对象
但是实际的结果是有空引用
请大家帮我看看呀
或者还有更好的办法通过值来查找键的也说说思路,我现在觉得我的这个思路有点错!
public class Grade
{ int chinese;
int math;
public Grade(int c,int m)
{
chinese=c;
math=m;
} public String toString() {
return "语文>>>:"+chinese+" 数学>>>"+math;
}
}
public class Stu
{ int id;
String name;
public Stu(int id,String name)
{
this.id=id;
this.name=name;
} public String toString() {
return "编号>>>:"+id+" 姓名>>>"+name;
}
}
o2[q]=o[k];//结果显示这里有空引用
o2是空的数祖对象,对于数组对象必须要先NEW一个对象值才可以对其进行操作。
Object o2[] = null; //需要new
o1 = sValue.toArray();
o2 = new Object[m.size()];//加上这句
// 因为,map中键不可以一样,但是值可以重复
/**
* 原理:由于map是一个键对应一个值,所以一个map中有多少个键,就有多少个值,用2个容器分别保存键和值,
* 然后遍历保存值的容器,如果传进来的参数和值相等,就取出当前容器的下标, 按照这个下标,从保存键的容器中取出相应的键
*/
public static Object[] mapValue(Map m, Object value) {
if (m.containsValue(value)) {
Collection sKey = m.keySet();// 用来保存键的集合
Collection sValue = m.values();// 用来保存值的集合
Object o[] = null;// 保存键的集合
Object o1[] = null;// 保存值的集合
Object o2[] = null;// 保存结果的集合
ArrayList list = new ArrayList();
//int q = 0;
o = sKey.toArray();
o1 = sValue.toArray();
System.out.println(o.length + "<---------->" + o1.length);
for (int i = 0; i < o.length; i++) {
System.out.println(o[i] + "----" + o1[i]);
}
for (int k = 0; k < o.length; k++) {
if (value.equals(o1[k]))// 这个地方没写好
{
list.add(o[k]);
//o2[q] = o1[k];// 结果显示这里有空引用
//q = q + 1;
}
}
o2 = list.toArray();
return o2;
} else {
return null;
}
}
}
看了你的代码,你是增加了一个ArrayList集合,然后调用ArrayList的toArray方法把返回的数组赋给o2
我觉得这样对程序的占用资源很大,本来我就用了3个数组了,想想,如果map集合里面的记录有100万条,我的这种思路我觉得根本就行不通了
Object[] keys = new Object[]{};
Set entryset = m.entrySet();
int i = 0;
for(Iterator iter = entryset.iterator();iter.hasNext();){
Entry entry = (Entry)iter.next();
if(entry.getValue() == value){
keys[i] = entry.getKey();
i++;
}
}
return keys;
}
public static Object[] mapValue(Map m, Object value) {
Vector keys = new Vector();
Set entryset = m.entrySet();
int i = 0;
for (Iterator iter = entryset.iterator(); iter.hasNext();) {
Entry entry = (Entry) iter.next();
if (entry.getValue() == value) {
System.out.println(entry.getKey());
keys.add(entry.getKey());
i++;
}
}
return keys.toArray();
}