将任何类型的ArrayList传递给方法

8
我正在开发我孩子的数学游戏,这是我的第一个Android应用程序,并在此过程中学习Java。我有两个ArrayList,一个包含整数0..9,另一个包含可能的操作字符串,目前只有+和-。
我想写一个方法,返回一个随机索引到ArrayList中,以便选择一个随机元素。但我遇到的问题是,我需要两种方法,一种适用于每种类型的ArrayList,即使代码是相同的。是否有办法在单个方法中完成这个操作?
现在我使用的方法:
Random randomGenerator = new Random();

  . . .

n = randomIndexInt(possibleOperands);
int op1 = possibleOperands.get(n);
n = randomIndexInt(possibleOperands);
int op2 = possibleOperands.get(n);
n = randomIndexStr(possibleOperations);
String operation = possibleOperations.get(n);

    . . .

int randomIndexInt(ArrayList<Integer> a){
    int n = randomGenerator.nextInt(a.size());
    return n;
}

int randomIndexStr(ArrayList<String> a){
    int n = randomGenerator.nextInt(a.size());
    return n;
}

我想要做的是将randomIndexIntrandomIndexStr合并成一个方法。

你可以编写一个方法,它将以A(类型为“int”)作为参数,并返回0到A之间的任意随机数,并调用此方法传递你的数组列表大小。 - Andrew Logvinov
记得接受一个答案,如果你也喜欢其他人的回答,可以点个赞哦 :) - Anders Metnik
1
为你的孩子编写一个数学游戏,加一分。 - irrelephant
谢谢大家的帮助,我在这里得到了很多帮助,进一步改进了我的方法,现在我的代码看起来像这样:int op1 = (Integer) getRandomElement(possibleOperands); int op2 = (Integer) getRandomElement(possibleOperands); String operation = (String) getRandomElement(possibleOperations); . . . Object getRandomElement(ArrayList a){ int n = randomGenerator.nextInt(a.size()); return a.get(n); }抱歉,我无法使此注释正确格式化。 - codingatty
7个回答

18

将您的方法声明为int randomIndexInt(ArrayList<?> a)


3
可以简单地写成 Collection<?>,因为这就是声明了 size() 方法的类型。 - Paul Bellora

7
你只需要数组的大小吗?那么这样做:
int randomIndex(int size){
    int n = randomGenerator.nextInt(size);
    return n;
}

谢谢。这是另一种方法,我之前也做过,但实际上我想尽可能多地将公共代码(包括获取数组大小)推入方法中。 - codingatty

5
用这段代码,您可以传递任何类型的列表。
int randomIndex(List<?> list){
    int n = randomGenerator.nextInt(list.size());
    return n;
}

谢谢,这对于数组来说还可以,但是int数组作为原始类型会出现问题。我想我可以使用Integer而不是int,但是<?>方法解决了问题。 - codingatty
你不能将 List<Integer>List<String> 传入此方法。 - Paul Bellora
哎呀,我忘记了泛型转换。谢谢@PaulBellora。 - neworld

2

只需做到这:

private int randomIndex(int size){
return randomGenerator(size);
}

然后使用 randomIndex(yourArray.size()); 调用它们。


2

在方法签名中,使用ListArrayList更通用。

int your_method(List<?> a){
//your code
}

1

您可以按照以下方式使用泛型

将您的函数声明如下

private <T> int randomIndex(ArrayList<T> a){
    int n = randomGenerator.nextInt(a.size());
    return n;
}

现在您可以将 ArrayList<String>ArrayList<Integer> 传递给此函数,而不会出现任何问题。
ArrayList<String> strList = new ArrayList<String>();
strList.add("on1");
System.out.println(randomIndex(strList));
ArrayList<Integer> intList = new ArrayList<Integer>();
intList.add(1);
System.out.println(randomIndex(intList));

0
int randomIndex1(ArrayList<?> a)
{
   int n = randomGenerator.nextInt(a.size());
   return n;
}

int randomIndex2(int size)
{
   int n = randomGenerator.nextInt(size);
   return n;
}

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