2012-07-31 12 views
6

Sto lavorando alla mia prima app per Android, un gioco di matematica per mio figlio, e sto imparando Java nel processo. Ho due ArrayList s, uno di interi 0..9 e una stringa di operazioni possibili, al momento, solo + e -.Passare una lista array di qualsiasi tipo a un metodo

Vorrei scrivere un metodo che restituisca un indice casuale in un ArrayList, così posso selezionare un elemento casuale. Quello che sto incontrando è che ho bisogno di due metodi, uno per ogni tipo di ArrayList, anche se il codice è identico. C'è un modo per farlo in un unico metodo?

Quello che uso ora:

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

Quello che mi piacerebbe fare è il collasso randomIndexInt e randomIndexStr in un unico metodo.

+0

È possibile scrivere un metodo che utilizzi A (di tipo 'int') come argomento e restituisce qualsiasi numero casuale compreso tra 0 e A e chiama questo metodo passando le dimensioni dell'elenco di array. –

+0

Ricorda di accettare una risposta e forse +1 se ti piace anche qualcun altro :) –

+1

+1 per la codifica di un gioco di matematica per tuo figlio. – irrelephant

risposta

13

dichiarare il metodo di come int randomIndexInt(ArrayList<?> a)

+0

Grazie, ha funzionato perfettamente. – codingatty

+3

Potrebbe essere semplicemente 'Collection ' poiché è ciò che dichiara 'size()'. –

7

È necessaria solo la dimensione dell'array? così lo fanno:

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

Grazie.Questo è un altro approccio, e quello che avevo fatto prima, ma in realtà volevo spingere il più possibile il codice comune (incluso ottenere le dimensioni della matrice) nel metodo. – codingatty

2

solo renderlo:

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

E poi li chiamano con randomIndex(yourArray.size());

3

con questo codice è possibile passare qualsiasi tipo della lista

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

Grazie; ha funzionato bene con l'array, ma l'array int lo soffoca come un tipo primitivo. Suppongo che potrei usare Integer invece di int, ma l'approccio l'ha risolto bene. – codingatty

+0

Non è possibile passare un 'Elenco ' o un 'Elenco ' in questo metodo. –

+0

Ups, mi dimentico del cast dei generici. Grazie a @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

è possibile utilizzare Generics come segue

dichiarare la funzione di seguito

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

ora si può passare ArrayList<String> o ArrayList<Integer> a questa funzione senza alcun problema come questo

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

Più generico è usare List di ArrayList nella firma del metodo.

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