Java,数组值的getter(动态定义的数组)

时间:2012-09-07 17:19:05

标签: java arrays object inheritance

我有一系列String[]数组,这些数组是单词列表。类似的东西:

String[] ListOne = new String[100];
String[] ListTwo = new String[100];
/*And so on with other lists */

ListOne[0] = "word00";
ListOne[1] = "word01";
/*And so on till*/
ListLast[99] = "word 99 from last list";

现在我想为每个列表提供一个函数,给定一个数字返回相应的元素(word):

public String GetFromListOne(int key) { return ListOne[key];} 

有没有办法避免手动编写每个getter函数?

例如,在PHP中,我只使用魔术方法__call
或者作为参数传递给列表名称并动态引用它。

有没有办法在Java中做类似的事情?
或者是实现相同结果的另一种策略?

7 个答案:

答案 0 :(得分:4)

你应该研究一下继承。

你基本上必须做的是定义一个接口(或扩展一个List类)

 public interface ListTest{
//**Gets keys from lists*//
GetFromListOne(int key);
}

然后

public class Listone implements ListTest{

/** methods **//
GetFromListOne(int key);
/** methods **//
}

扩展乐趣

http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html

答案 1 :(得分:1)

您可以使用二维数组或数组列表,并使您的函数采用2个参数。一个用于您想要的数组,另一个用于数组中的元素。

二维数组:

String[][] ListN = new String[100,100];

String getFromList(int n, int key) {
    return ListN[n][key];
}

或数组列表:

List<String[]> listOfArrays = new ArrayList<String[]>();
listOfArrays.add(new String[100]);
listOfArrays.add(new String[100]);


String getFromList(int n, int key) {
    return listOfArrays.get(n)[key];
}

答案 2 :(得分:0)

你能否拥有一个以键和列表编号作为输入的函数:

public String GetFromListOne(int list, int key) {
    switch(list):
       case 1:
           return ListOne[key];
           break;
       case 2:
           return ListTwo[key];
           break;
       ...
}

甚至更好地制作一个数组数组:

String[][] ListOfLists = new String[10];
ListOfLists[0] = new String[100];
...

public String GetFromList(int list, int key) {
    return ListOfLists[list][key];
}

否则我不知道要覆盖的函数如__call

答案 3 :(得分:0)

基于__call PHP方法,你可以实现这个实现一个接收列表和索引的方法,并使用泛型你可以得到这样的东西。

public class Utility {
    public <T> T getElementFromArray(T[] array, int index) {
        if (index >= array.length || index < 0) return null;
        return array[index];
    }
}

此方法的缺陷是不能用于原始数组持有者,如int[]。这些情况的解决方案是使用原始类型的包装类。

public static void main(String[] args) {
    Utility u = new Utility();
    String[] ss = new String[2];
    ss[0] = "Hello";
    ss[1] = "world!";
    System.out.println(u.getElementFromArray(ss, 0));
    System.out.println(u.getElementFromArray(ss, 1));
    int[] ii = new int[2];
    ii[0] = 5;
    System.out.println(u.getElementFromArray(ii, 0)); //compile error
    //Solution: use wrapper classes
    Integer[] ii2 = new Integer[2];
    ii2[0] = 5;
    System.out.println(u.getElementFromArray(ii2, 0));
}

答案 4 :(得分:0)

与其他人建议的类似,您可以改为使用HashMap类型构造:

HashMap<String, String[]> lists = new HashMap<String, String[]>();

然后添加您的列表:

String[] ListOne = new String[100];
String[] ListTwo = new String[100];
...
setup your lists
...
lists.put("one", ListOne);
lists.put("two", ListTwo);

像这样访问您的列表:

public String GetFromList(String list, int key) {
    return lists.get(list)[key];
}

...

String data = GetFromList("one", 99);

这只是一个粗略的例子,希望它有所帮助。

答案 5 :(得分:0)

   String[] ListFour=new String[100];
   String[] ListTwentyThree=new String[100];
   String[] ListNine=new String[100];
   String[] ListOne=new String[100];

   Hashtable<Integer,String[]> yourlist=new Hashtable<Integer,String[]>();      
   yourlist.put(4, ListFour);
   yourlist.put(23, ListTwentyThree);
   yourlist.put(9, ListNine);
   yourlist.put(1, ListOne);
   System.out.println(yourlist.get(4)[5]);//fifth string in ListFour
   System.out.println(yourlist.get(23)[51]);//fifty first string in List23
    System.out.println(yourlist.get(9)[1]);//first stringin ListNine

另一个版本:

   Hashtable<Object,String[]> yourlist=new Hashtable<Object,String[]>();        
   yourlist.put("two multiplied by two", ListFour);
   yourlist.put(23, ListTwentyThree);
   yourlist.put(0.03, ListNine);
   yourlist.put(true, ListOne);
   System.out.println(yourlist.get("two multiplied by two")[5]);//fifth string in ListFour
   System.out.println(yourlist.get(23)[51]);//fifty first string in List23
    System.out.println(yourlist.get(true)[1]);//first stringin ListNine

答案 6 :(得分:0)

试试此代码

List<String[]> lists = new ArrayList<String[]>();

public String getFromLists(int key) {
  List<String> res = new ArrayList<String>();
  for (String[] s: lists){
      res.add(s[key]);
  }    
  return res.get(key);
}

或更好

public String getFromLists(int key) {
  return lists.get(key)[key];
}