2

我有一系列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";

现在我想要每个列表的函数,给定一个数字返回相应的元素(单词):

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

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

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

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

4

6 回答 6

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

于 2012-09-07T17:25:46.803 回答
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];
}
于 2012-09-07T17:27:50.557 回答
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 这样可以覆盖的函数

于 2012-09-07T17:23:21.873 回答
0

基于__callPHP 方法,您可以通过实现接收列表和索引的方法来实现这一点,并且使用泛型您可以获得类似的东西。

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));
}
于 2012-09-07T17:35:43.350 回答
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
于 2012-09-07T17:38:37.803 回答
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];
}
于 2012-09-07T17:41:51.213 回答