Java能否使用用户定义的对象作为二维数组键的索引?

3
array[obj][obj] = 1;

我想创建一个二维数组,其索引是用户定义的对象。如何做到这一点?或者是否有其他数据结构可供使用?

如果你必须使用一个数组,调用“Array.newInstance()”。 - Socratic Phoenix
根据chrylis的建议,使用Map<keyObj,ValueObj>。但是,请记住您可能需要为keyObj实现hashCode和equals方法。 - Himanshu Soni
3个回答

0
在一个数组中,索引只能是short、byte、char或int之一。 对于您的用例,您可能希望使用HashMap,它是一组键和相应值的集合。键可以是任何用户定义的对象,值也可以是任何定义的对象。 一个简单的HashMap示例,其中键的类型为String,值的类型为Double。
  HashMap hm = new HashMap();
  // Put elements to the map
  hm.put("Zara", new Double(3434.34));
  hm.put("Mahnaz", new Double(123.22));
  hm.put("Ayan", new Double(1378.00));
  hm.put("Daisy", new Double(99.22));
  hm.put("Qadir", new Double(-19.08));

0

不,Java语言规范指出数组只能使用int进行访问。但由于原始类型提升的作用,shortcharbyte也可以被使用,因为它们会自动转换为int

解决您的问题:您可以在对象内部存储一个int索引,然后使用它来访问数组。

array[obj.getIndex()][obj.getIndex()] = 1;

如果您无法直接影响用户定义对象的代码,请强制用户实现一个要求 getIndex() 方法的 interface
interface ArrayIndexable {

    int getIndex();

}

如果你不能强制用户实现接口的话,那么你可以使用一个映射表来维护一些索引,将对象映射到一个整数int上。

int x = ...;
int y = ...;
int[][] array = new int[x][y];

Map<SomeClass, Integer> index = new HashMap<>();
for(int i = 0; i < Math.max(x, y); i++) {
    SomeClass m = ...; // object associated with i
    index.put(m, i);
}

SomeClass obj = ...;

// accessing the array
array[index.get(obj)][index.get(obj)] = 1;

0
不,Java中的数组索引只能是整数,但有一种方法可以实现此目的。
使用哈希映射将关联数组索引到对象,并为每个值检索索引值,使用对象作为键并将其用作索引。
//此示例将帮助您
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

public class Experiment {

    public static void main(String[] args) {

        int a[]=new int[10];
        HashMap<Student,Integer>map=new HashMap<>();

        for (int i = 0; i < 10; i++) {
            map.put(new Student(),i);
            a[i]=i;
        }

        ArrayList al=new ArrayList(map.keySet());
        int x;

        for (int i = 0; i < al.size(); i++) {
            x=map.get(al.get(i));
            System.out.print(a[x] + " " + " ");
        }
    }
}

class Student{
    int a,b;
}

但请记住,哈希映射不保留插入顺序。

如果您遇到任何问题,请评论;如果可以使用,请接受。

如果您想要插入顺序,可以选择树映射。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接