[pętla] chartAt i random

0

Czy ktoś mi może powiedzieć co mam zmienić w tej petli, aby działa ona poprawnie? (błąd wyskakuje mi na pozycji 'index.lenght()', konwertowanie na stringa nie działa, ale gdyby nawet to i tak string mi tu nie pomoże, bo testowałem to już na testowym pliku, pisze że int index2 nie może być stringiem)

public String talk(int i) {
		String output=" ";
		load2();
		Random rand = new Random();
		for (int q=0; q<i; q++){
			int index1=rand.nextInt(monkeys.size());
			Integer.toString(index1);
			int index2=index1.charAt(rand.nextInt(index1.lenght()));
			output+=""+index2;
			if(output.length()>i)
			break;
		}
		return output;
	}
0
  1. Integer.toString(index1); => Nigdzie nie przypisujesz wyniku działania metody.
  2. length
0

Zmieniłem właśnie cały tok rozumowania. Być może nie powinienem zmieniać pętli, być może problem jest z wczytywaniem plików do arraylisty? Chce żeby do ArrayListy zostały wczytane wszystkie znaki/literki (wraz ze spacjami), wszystko osobno.

public void load2() {
		Scanner infile;
		try {
			infile = new Scanner(new InputStreamReader (new FileInputStream(file2)));
		for (int i=0; i<file2.length(); i++){
			String n = infile.next();
			for (int i2=0; i2<n.length(); i2++){
			Monkey w = new Monkey(n);
			monkeys.add(w);
			}
		}

Czy ktos mi pomoże, przerobić ten kod?

0

public String talk(int i) {
String output=" ";
load2(); // tu wywolujesz jakąś funkcję, co jest bez znaczenia
Random rand = new Random(); // losujesz liczbę rand
for (int q=0; q<i; q++){
int index1=rand.nextInt(monkeys.size()); //index1 jest losową liczbą
Integer.toString(index1); // tu wywołujesz funkcję, której wynikiem jest zamiana cyfry z typu int, na cyfrę w typie String
int index2=index1.charAt(rand.nextInt(index1.lenght())); //index2 przyjmuje wartość cyfry na ustalonej pozycji
output+=""+index2; // dodajesz do output ciąg znaków index2, które są cyfrą !
if(output.length()>i)
break;
}
return output;
}

W efekcie dodajesz więc cyfry. Nie powinno Cię to dziwić.

Lepiej będzie jak nakreślisz jak ma to mniej więcej działać. Bo poprawność semantyczna, a cel programistyczny nie muszą być zbieżne ;)

pozdrawiam

0

Funkcja ma losować z pliku txt pojedyncze litery (oraz spacje) i wyświetlić je jako 85 znakowy ciąg

0

Ja bym to zrobił w sposób następujący:

import java.util.Random;
import java.io.BufferedReader;
import java.io.FileReader;

	try{                                                                                          
            BufferedReader plik=new BufferedReader(new FileReader("plik.txt"));
            String str="";
            Random rand= new Random();
            while(plik.ready()){
                  str+=Character.toString((char)plik.read());
            } 
            for(int i=0;i<85;i++) 
                  System.out.print(str.charAt(rand.nextInt(str.length())));                                                                                                                                                            
            plik.close();                                                                          
	}                                                                                          
	catch(Exception e){
            System.out.println(e);
	}                                                 
0

Przekształciłem trochę Twój kod na coś takiego:

public String talk(int i){
	try{                                                                                         
        String output="";
		BufferedReader reader=new BufferedReader(new FileReader(file2));
        String str="";
        Random rand= new Random();
        while(reader.ready()){
              str+=Character.toString((char)reader.read());
        }
        for(int i1=0;i1<i;i1++)
              output += (str.charAt(rand.nextInt(str.length())));                                                                                                                                                           
        reader.close();
        return output;
    }    
    catch(Exception e){
        System.out.println(e);
    }
	return output;
	}

Musiałem dodac return ponieważ funkcja ma zwracać stringa w takiej postaci. Jednak teraz jest malutki błąd. otóż po 2,3 wylosowanych wyrazach tworzą się przejścia do następnej linii. Może pokażę o co chodzi:

T R- AA JNRLF
TIDOTPDLSH
O O ELE,HHTP
 KHWPEAAP 
YSEA Z,IOAIT L L
ITAKIH ITO S SSNE,O

Dało by radę zrobic to w jednym ciągu?

@Edit
Mój błąd, to sprawa pliku textowego już to zauważyłem :)

0

Dałoby radę:
1 sposób

        for(int i1=0;i1<i;i1++)
              output += (str.charAt(rand.nextInt(str.length()))); 

po wylosowaniu a przed doklejeniem sprawdzać czy się nie wylosowało '\n', jeśli się wylosowało to nie doklejać
2 sposób: przed wypisaniem zrobić coś w rodzaju

output=output.replace('\n','');

W pierwszym sposobie dużo łatwiej uzyskać żeby ciąg wyjściowy miał 85 znaków.

0

Problem polega na tym, że dodajemy do 'str' znaki końca linii. (Ponieważ zapisujesz dane w pliku w osobnych wierszach). Jeśli chcesz się trzymać tej konwencji zapisu danych do pliku, to zalecam sprawdzanie znaku końca linii przed dodaniem elementu do 'str':

String file2="plik.txt";

public String talk(int i){
        String output="";
        try{                                                                                         
        	String str="";
        	BufferedReader reader=new BufferedReader(new FileReader(file2));
        	Random rand= new Random();
        	while(reader.ready()){
        		char tmp=(char)reader.read();
        		if ((tmp!='\n')&&(tmp!='\r')) ////// Sprawdzanie znaku końca linii
        			str+=tmp;
        	}
        	for(int i1=0;i1<i;i1++)
        		output += (str.charAt(rand.nextInt(str.length())));                                                                                                                                                           
        	reader.close();
        }   
        catch(Exception e){
        	System.out.println(e);
        }
        return output;
}
0

Dzięki wielkie MarkII, działa jak należy. ;]

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