2012-07-31 12 views
6

Pracuję nad moją pierwszą aplikacją na Androida, grą matematyczną dla mojego dziecka i uczę się w tym procesie Java. Mam dwie: ArrayList s, jedną z liczb całkowitych 0..9 i jedną ciągiem możliwych operacji, obecnie tylko + i -.Przekazywanie tablicy ArrayList dowolnego typu do metody

Chciałbym napisać metodę, która zwraca losowy indeks do ArrayList, więc mogę wybrać losowy element. Rozumiem, że potrzebuję dwóch metod, po jednej dla każdego typu ArrayList, mimo że kod jest identyczny. Czy jest sposób na zrobienie tego w jednej metodzie?

Co używam teraz:

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; 
} 

Co chciałbym zrobić, to upadek randomIndexInt i randomIndexStr w jeden sposób.

+0

Możesz napisać metodę, która przyjmie A (typu 'int') jako argument i zwróci dowolną liczbę losową pomiędzy 0 i A i wywoła tę metodę, przekazując twoje rozmiary listy tablic. –

+0

Pamiętaj, aby zaakceptować odpowiedź, a może +1, jeśli lubisz też kogoś innego :) –

+1

+1 za kodowanie gry matematycznej dla Twojego dziecka. – irrelephant

Odpowiedz

13

zadeklarować swoją metodę jako int randomIndexInt(ArrayList<?> a)

+0

Dzięki, że działało idealnie. – codingatty

+3

Może to być po prostu 'Collection ', ponieważ to właśnie deklaruje 'size()'. –

7

Potrzebujesz tylko rozmiaru tablicy w prawo? tak zrobić:

int randomIndex(int size){ 
    int n = randomGenerator.nextInt(size); 
    return n; 
} 
+0

Dzięki.To jest inne podejście, które zrobiłem wcześniej, ale chciałem wprowadzić jak najwięcej wspólnego kodu (w tym rozmiar Array) do metody. – codingatty

2

prostu zrobić go:

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

a następnie wywołać je randomIndex(yourArray.size());

3

z tym kodem można przekazać dowolny typ z listy

int randomIndex(List<?> list){ 
    int n = randomGenerator.nextInt(list.size()); 
    return n; 
} 
+0

Dzięki; to działało dobrze z tablicą, ale tablica int dławi ją jako typ pierwotny. Przypuszczam, że mógłbym użyć Integer zamiast int, ale podejście naprawiło to ładnie. – codingatty

+0

Nie można przekazać 'List ' lub 'List ' do tej metody. –

+0

Ups, zapominam o obsadzie leków generycznych. Dzięki @PaulBellora. – neworld

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

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

można użyć Generics następująco

zadeklarować swoją funkcję jak poniżej

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

teraz można przekazać ArrayList<String> lub ArrayList<Integer> do tej funkcji bez problemu tak

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)); 
2

Bardziej ogólne jest użycie od List niż ArrayList w metodzie podpis.

int your_method(List<?> a){ 
//your code 
} 
Powiązane problemy