我有一系列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中做类似的事情?
或者是实现相同结果的另一种策略?
答案 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];
}