Wątek przeniesiony 2015-02-13 10:31 z Java przez bogdans.

Losowanie zdań z tablicy w randomowych kolejnościach

0

Witam.

String[] r = {zdanieA + zdanieB, zdanieB + zdanieA};
		
int idxR = new Random().nextInt(r.length);
String randomR = (r[idxR]);
	
System.out.println(randomR);

Przypuśćmy, że zdanieA to "czerwony" a zdanieB to "pomidor". Powyższy kod, będzie wyświetlał losowo albo zdanie "czerwony pomidor", albo "pomidor czerwony". Przy dwóch zdaniach kod nie jest uciążliwy, ponieważ dla dwóch zdań ilość elementów w tablicy to 2! (silnia). Jednak rozbudowując program o więcej zdań np. 10, tablica miałaby już 10! (silnia) elementów i nie będzie to wygodne rozwiązanie.

Dlatego mam pytanie dość początkującego programisty. Jak zrobić, jeśli mam załóżmy 3 zdania, każde w innym Stringu i chciałbym żeby zawsze program wyświetlał je w losowej kolejności?

1
String[] first = {"czerwony","zielony","zimny",...};
String[] second = {"pomidor"," ziemniak","samiec",...};
Random r = new Random();
String sentence = first[r.nextInt(first.length)]+" "+second[r.nextInt(second.length)];

A czy początkujący programista nie powinien zadawać pytań w dziale Newbie?

0

Przepraszam za nieprawidłowy dział, na przyszłość postaram się zapamiętać.
Dziękuję za próbę pomocy, jednak nie jest to tym, czego szukam. Prawdopodobnie źle wytłumaczyłem problem, dlatego spróbuję jeszcze raz.

String[] first = {"czerwony","zielony","zimny",...};
String[] second = {"pomidor"," ziemniak","samiec",...};
Random r = new Random();
String sentence = first[r.nextInt(first.length)]+" "+second[r.nextInt(second.length)];

W tym kodzie, zawsze na pierwszym miejscu jest wyraz z tablicy first, a na drugim z tablicy second. Mi zależy na tym, żeby kolejność ta była wymieszana. Podam bardziej życiowy, konkretny przykład. Mam cztery zdania załóżmy.

String a = " Jest sprawny.";
String b = " Jest bezwypadkowy.";
String c = " Posiada instalację LPG.";
String d = " Nie wymaga wkładu finansowego.";

System.out.println("Samochód" + a + b + c + d);

Zależy mi na tym, żeby program randomowo kleił te zdania. Np. raz niech wyświetli "Samochód" + d + b + a + c. Innym razem nich to będzie "Samochód" + a + d + b + c. Mam na myśli to, żeby kolejność zdań a, b, c i d wyświetlała się w wyniku losowo i żeby zdania nie powtarzały się.

1

Wygodniej (bo jest metoda shuffle) jest użyć kolekcji. Kod w Javie 7, w 8 można chyba uprościć skrócić i skomplikować.

ArrayList<String> zdania = new ArrayList<String>();
zdania.add(" jest sprawny");
zdania.add(" jest bezwypadkowy");
...
Collections.shuffle(zdania);
StringBuilder opis = new StringBuilder("Samochód");
for(String s:zdania)
{
     opis.append(s);
}
System.out.println(opis);
0

To jest rozwiązanie mojego problemu. Serdecznie dziękuję!

0

Witam, jako że mój problem dotyczy kawałka kodu z tego tematu, postanowiłem napisać w tym temacie, zamiast zakładać nowy.
Mianowicie, posłużyłem się kodem Bogdansa, jednak zdanie, który się losuje dzięki temu kodowi, występuje tylko raz podczas uruchomienia aplikacji, a ja chciałbym, by losował się przy każdym wciśnięciu przycisku JButton. W jaki sposób mogę to zrobić?

Tutaj kod którym się posłużyłem:

bogdans napisał(a):
String[] first = {"czerwony","zielony","zimny",...};
String[] second = {"pomidor"," ziemniak","samiec",...};
Random r = new Random();
String sentence = first[r.nextInt(first.length)]+" "+second[r.nextInt(second.length)];

Tutaj mój kod:

 public class gz {
	public static void main(String args[]) {
		JFrame frame = new JFrame("Losuj Zdanie");
		frame.setSize(300,300);
		frame.setLocation(300,300);
		frame.setResizable(false);
		frame.setLayout(null);
		
		Random r = new Random();
		String[] first = {"Masz "};
		String[] second = {"20 lat","30 lat","40 lat"};
		String zdanie= first[r.nextInt(first.length)]+" "+second[r.nextInt(second.length)];
		
		JTextField tf = new JTextField();
		tf.setBounds(25, 10, 250, 24);
		Font f = new Font("New Times Roman",Font.BOLD,14);
		frame.add(tf);
		tf.setFont(f);
		
		
		JButton button = new JButton("Losuj zdanie");
		JButton wyczysc = new JButton("Wyczyść");
		wyczysc.setBounds(150, 170, 75, 40);
		button.setBounds(10, 170, 90, 40);
		button.setBorder(null);
		wyczysc.setBorder(null);
		frame.add(wyczysc);
		frame.add(button);
		
		button.addActionListener(new ActionListener()
				{
					public void actionPerformed(ActionEvent arg0) {
					tf.setText(zdanie);							
					}
				
				});
		
		wyczysc.addActionListener(new ActionListener()
				{
				public void actionPerformed(ActionEvent arg0) {
					tf.setText("");
				}
				
				
				});

		frame.setVisible(true);
	}

}

Chciałbym jeszcze zaznaczyć, że jestem totalnie początkujący.

1
 public class gz {
 
    Random r = new Random();
    String[] first = {"Masz "};
    String[] second = {"20 lat","30 lat","40 lat"};
    public static void main(String args[]) {
        JFrame frame = new JFrame("Losuj Zdanie");
        frame.setSize(300,300);
        frame.setLocation(300,300);
        frame.setResizable(false);
        frame.setLayout(null);
 
        JTextField tf = new JTextField();
        tf.setBounds(25, 10, 250, 24);
        Font f = new Font("New Times Roman",Font.BOLD,14);
        frame.add(tf);
        tf.setFont(f);
 
 
        JButton button = new JButton("Losuj zdanie");
        JButton wyczysc = new JButton("Wyczyść");
        wyczysc.setBounds(150, 170, 75, 40);
        button.setBounds(10, 170, 90, 40);
        button.setBorder(null);
        wyczysc.setBorder(null);
        frame.add(wyczysc);
        frame.add(button);
 
        button.addActionListener(new ActionListener()
                {
                    public void actionPerformed(ActionEvent arg0) {
                    String zdanie= first[r.nextInt(first.length)]+" "+second[r.nextInt(second.length)];
                    tf.setText(zdanie);                            
                    }
 
                });
0

No przecież! To bardzo logiczne, wielkie dzięki. Tylko jeszcze jedno pytanie, co daje przeniesienie tego:

    Random r = new Random();
    String[] first = {"Masz "};
    String[] second = {"20 lat","30 lat","40 lat"};

ponad to:

 public static void main(String args[]) {

Pytam, bo być może na tym etapie tej aplikacji nic to nie zmienia, to jest to jednak nieco intrygujące.

1
Szyniu napisał(a):

... co daje przeniesienie tego ...
Porządek, oraz możliwość wykorzystania w innych metodach.

0

Dzięki za odpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1