Recupero di un object casuale da ArrayList

Sto imparando Java e sto avendo un problema con ArrayList e RandomGenerator .

Ho un object chiamato catalogue che ha una lista di array di oggetti creati da un’altra class chiamata item .

Ho bisogno di un metodo in catalogue che restituisca tutte le informazioni su uno degli oggetti item nell’elenco.
L’ item deve essere selezionato a caso.

 import java.util.ArrayList; import java.util.Random; public class Catalogue { private Random randomGenerator; private ArrayList catalogue; public Catalogue () { catalogue = new ArrayList(); } public Item anyItem() { int index = randomGenerator.nextInt(catalogue.size()); return catalogue.get(index); System.out.println("Managers choice this week" + anyItem + "our recommendation to you"); } 

Quando provo a compilare, ricevo un errore che indica la riga System.out.println che dice ..

‘imansible trovare la variabile simbolo anyItem’

anyItem è un metodo e la chiamata System.out.println è successiva all’istruzione return in modo tale che non verrà compilata comunque poiché non è raggiungibile.

Potrebbe voler riscriverlo come:

 import java.util.ArrayList; import java.util.Random; public class Catalogue { private Random randomGenerator; private ArrayList catalogue; public Catalogue() { catalogue = new ArrayList(); randomGenerator = new Random(); } public Item anyItem() { int index = randomGenerator.nextInt(catalogue.size()); Item item = catalogue.get(index); System.out.println("Managers choice this week" + item + "our recommendation to you"); return item; } } 
 public static Item getRandomChestItem(List items) { return items.get(new Random().nextInt(items.size())); } 

È necessario rimuovere il messaggio system.out.println da sotto il return , in questo modo:

 public Item anyItem() { randomGenerator = new Random(); int index = randomGenerator.nextInt(catalogue.size()); Item it = catalogue.get(index); System.out.println("Managers choice this week" + it + "our recommendation to you"); return it; } 

la dichiarazione di return dice sostanzialmente che la funzione finirà ora. tutto ciò che è incluso al di là della dichiarazione di reso che è anche nella sua portata si tradurrà nel comportamento che hai vissuto

la tua stampa arriva dopo il tuo ritorno – non puoi mai raggiungere quella dichiarazione. Inoltre, non hai mai dichiarato qualsiasi elemento come variabile. Forse vorresti

 public Item anyItem() { int index = randomGenerator.nextInt(catalogue.size()); Item randomItem = catalogue.get(index); System.out.println("Managers choice this week" + randomItem.toString() + "our recommendation to you"); return randomItem; } 

La parte toString è solo una sveltina: potresti voler aggiungere un metodo ‘getItemDescription’ che restituisce una stringa utile per questo scopo …

Ecco qua, usando Generics :

 private  T getRandomItem(List list) { Random random = new Random(); int listSize = list.size(); int randomIndex = random.nextInt(listSize); return list.get(randomIndex); } 

prova questo

  public Item anyItem() { int index = randomGenerator.nextInt(catalogue.size()); System.out.println("Managers choice this week" + catalogue.get(index) + "our recommendation to you"); return catalogue.get(index); } 

E ti consiglio caldamente di procurarti un libro, ad esempio Beginning Java 2 di Ivor Horton

anyItem non è mai stato dichiarato come variabile, quindi ha senso che causi un errore. Ma ancora più importante, hai il codice dopo una dichiarazione di ritorno e questo causerà un errore di codice irraggiungibile.

System.out.println (“Scelta dei gestori questa settimana” + anyItem + “la nostra raccomandazione per te”);

Non hai la variabile anyItem inizializzata o nemmeno dichiarata.

Questo codice: + anyItem +

significa ottenere il valore del metodo toString dell’object AnyItem

La seconda cosa perché questo non funzionerà. Hai System.out.print dopo la dichiarazione di ritorno. Il programma non potrebbe mai raggiungere la linea.

Probabilmente vuoi qualcosa come:

 public Item anyItem() { int index = randomGenerator.nextInt(catalogue.size()); System.out.println("Managers choice this week" + catalogue.get(index) + "our recommendation to you"); return catalogue.get(index); 

}

btw: in Java la sua convinzione per posizionare la parentesi graffa sulla stessa riga della dichiarazione della funzione.

Come posso vedere il codice
System.out.println("Managers choice this week" + anyItem + "our recommendation to you");
è irraggiungibile.

La soluzione non è buona, anche tu hai corretto la tua denominazione e la dichiarazione irraggiungibile di quella stampa.

le cose a cui dovresti prestare attenzione anche 1. seme di casualità e grandi dati, il numero di oggetti è il numero restituito così grande di quello

  1. non hai gestito il multithread, potresti ottenere l’indice dall’eccezione legata

Vedi https://gist.github.com/nathanosoares/6234e9b06608595e018ca56c7b3d5a57

 public static void main(String[] args) { RandomList set = new RandomList<>(); set.add("a", 10); set.add("b", 10); set.add("c", 30); set.add("d", 300); set.forEach((t) -> { System.out.println(t.getChance()); }); HashMap count = new HashMap<>(); IntStream.range(0, 100).forEach((value) -> { String str = set.raffle(); count.put(str, count.getOrDefault(str, 0) + 1); }); count.entrySet().stream().forEach(entry -> { System.out.println(String.format("%s: %s", entry.getKey(), entry.getValue())); }); } 

Produzione:

2,857142857142857

2,857142857142857

8,571428571428571

85,71428571428571

a: 2

b: 1

c: 9

d: 88

Ecco un modo migliore di fare le cose:

 import java.util.ArrayList; import java.util.Random; public class facultyquotes { private ArrayList quotes; private String quote1; private String quote2; private String quote3; private String quote4; private String quote5; private String quote6; private String quote7; private String quote8; private String quote9; private String quote10; private String quote11; private String quote12; private String quote13; private String quote14; private String quote15; private String quote16; private String quote17; private String quote18; private String quote19; private String quote20; private String quote21; private String quote22; private String quote23; private String quote24; private String quote25; private String quote26; private String quote27; private String quote28; private String quote29; private String quote30; private int n; Random random; String teacher; facultyquotes() { quotes=new ArrayList<>(); random=new Random(); n=random.nextInt(3) + 0; quote1="life is hard"; quote2="trouble shall come to an end"; quote3="never give lose and never get lose"; quote4="gamble with the devil and win"; quote5="If you don’t build your dream, someone else will hire you to help them build theirs."; quote6="The first step toward success is taken when you refuse to be a captive of the environment in which you first find yourself."; quote7="When I dare to be powerful – to use my strength in the service of my vision, then it becomes less and less important whether I am afraid."; quote8="Whenever you find yourself on the side of the majority, it is time to pause and reflect"; quote9="Great minds discuss ideas; average minds discuss events; small minds discuss people."; quote10="I have not failed. I’ve just found 10,000 ways that won’t work."; quote11="If you don’t value your time, neither will others. Stop giving away your time and talents. Value what you know & start charging for it."; quote12="A successful man is one who can lay a firm foundation with the bricks others have thrown at him."; quote13="No one can make you feel inferior without your consent."; quote14="Let him who would enjoy a good future waste none of his present."; quote15="Live as if you were to die tomorrow. Learn as if you were to live forever."; quote16="Twenty years from now you will be more disappointed by the things that you didn’t do than by the ones you did do."; quote17="The difference between a successful person and others is not a lack of strength, not a lack of knowledge, but rather a lack of will."; quote18="Success is about creating benefit for all and enjoying the process. If you focus on this & adopt this definition, success is yours."; quote19="I used to want the words ‘She tried’ on my tombstone. Now I want ‘She did it."; quote20="It is our choices, that show what we truly are, far more than our abilities."; quote21="You have to learn the rules of the game. And then you have to play better than anyone else."; quote22="The successful warrior is the average man, with laser-like focus."; quote23="Develop success from failures. Discouragement and failure are two of the surest stepping stones to success."; quote24="If you don’t design your own life plan, chances are you’ll fall into someone else’s plan. And guess what they have planned for you? Not much."; quote25="The question isn’t who is going to let me; it’s who is going to stop me."; quote26="If you genuinely want something, don’t wait for it – teach yourself to be impatient."; quote27="Don’t let the fear of losing be greater than the excitement of winning."; quote28="But man is not made for defeat. A man can be destroyed but not defeated."; quote29="There is nothing permanent except change."; quote30="You cannot shake hands with a clenched fist."; quotes.add(quote1); quotes.add(quote2); quotes.add(quote3); quotes.add(quote4); quotes.add(quote5); quotes.add(quote6); quotes.add(quote7); quotes.add(quote8); quotes.add(quote9); quotes.add(quote10); quotes.add(quote11); quotes.add(quote12); quotes.add(quote13); quotes.add(quote14); quotes.add(quote15); quotes.add(quote16); quotes.add(quote17); quotes.add(quote18); quotes.add(quote19); quotes.add(quote20); quotes.add(quote21); quotes.add(quote22); quotes.add(quote23); quotes.add(quote24); quotes.add(quote25); quotes.add(quote26); quotes.add(quote27); quotes.add(quote28); quotes.add(quote29); quotes.add(quote30); } public void setTeacherandQuote(String teacher) { this.teacher=teacher; } public void printRandomQuotes() { System.out.println(quotes.get(n++)+" ~ "+ teacher); } public void printAllQuotes() { for (String i : quotes) { System.out.println(i.toString()); } } }