Jak zapisać do tablicy char [] wszystkie linijki wprowadzone z Consoli?

0

Cześć mam problem. Nie wiem jak zapisać do tablicy wszystkie linijki które wprowadzam poprzez konsole...
Według kodu poniżej do tablicy dodaje się tylko ostatnia linijka wprowadzana z konsoli. Proszę o pomoc.

package javaapplication24;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;


public class JavaApplication24 {

    public static void main(String[] args) throws IOException {
       
        BufferedReader in =new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out=new PrintWriter(System.out);
        int n=Integer.parseInt(in.readLine());

       char [] tablica=null;
        for(int q=0;q<n;q++)
        {
             String linia=in.readLine().trim();
             tablica= linia.toCharArray();  
        }
        for(int i=0;i<tablica.length;i++)   
            System.out.print(tablica[i]);
    }
}
0

Musisz to zrobić? Po pierwsze, tablica powinna być dwuwymiarowa (char[][]). Po drugie, będą kłopoty z deklaracją, bo ilość wierszy tablicy jest nieznana.
Doczytałem, że ilość wierszy jednak jest znana.

char[][] tablica = new char[n][];
...
tablica[q] = linia.toCharArray();
0

dlaczego nie użyjesz List<String> listy ?

0

bogdans fajnie dzięki Działa :). Wiem już na przyszłość że tak się robi. Jednak jak tak zrobiłem to mojego problem nie rozwiązało niestety.

Chcę zrobić algorytm, który policzy ile liter wystąpiło właśnie w wprowadzanych linijkach...
Nie jest problemem żeby algorytm policzył litery w jednej linijce i wypisał wynik... później w drugiej i znowu wypisał... a później w 'entej' i też wypisał.

Mam algorytm który teraz zlicza tylko ostatnią linijke wprowadzoną w konsoli...
link: http://ideone.com/1U62f9

Oczywiście tak jak wyżej napisałem jak wsadzę wszystko do pętli while to mi będzie po każdej linijce wpisywanej do konsoli wywalało wynik.

Ja jednak mam za zadanie obliczyć lutery we wszystkich linijkach...
np.
wejscie:

abcdd
adQpa

wyjście:

a 3
b 1
c 1
d 3
p 1
Q 1

Wiem że muszę dodać przed zliczaniem liter wszystkie linijki do Tablicy, a później tą tablice wykorzystać do obliczeń.
Dlatego właśnie spytałem jak zapisać wszytskie linijki String do tablicy char.

dodanie znaczników <code class="none"> - @furious programming

0

Musisz użyć tablicy, bo takie jest polecenie? Czy Tobie wydaje się, że musisz użyć tablicy? Wygodniejsza jest HashMap<Character,Integer>.
W pierwszym programie czytasz ilość wierszy, w przykładowym wejściu nie ma ilości wierszy. To jest dość istotna różnica.

0

@poprawka, weź się za jakiś kurs podstawowy bo to mozna zrobić w kilku linijkach, a twoja wersja jest MEGA nieczytelna.

0

@some_ONE na pewno masz rację. Dzięki za pomoc.

@bogdans tylko tak mi się wydawało że tak można zrobić.

0

W javie 8 można to zrobić bardziej elegancko.

linia = in.readLine().trim();
HashMap<Character,Integer> counters = countChars(ss);
for(char c:counters.keySet())
{
      System.out.println(c+" "+counters.get(c));
}
...
static private HashMap<Character,Integer> countChars(String s)
{
    HashMap<Character,Integer> map = new HashMap<Character,Integer>();
    for(char c: s.toCharArray())
    {
        if(map.containsKey(c))
        {
            map.put(c,map.get(c)+1);
        }
        else
        {
            map.put(c,1);
        }
    }
    return map;
}
0

@bogdans dziękuję że mi pomagasz. Po implementacji Twojego kodu mam takie same wyniki, na pewno to co napisałeś jest lepsze, ładniejsze, szybsze jednak ja jeszcze do tego poziomu nie doszedłem.
Tak jak napisałem zaimplementowałem Twój kod do siebie i wynik taki sam czyli:
wejście:

3            //ilość zestawów
aaabbb
cccaaa
cccbbb

wyjscie:

a 3      //po każdym zestawie jest jedno wyjście
b 3

c 3 
a 3

c3
b3

a powinno być jedno wyjście:

a 6
b 6
c 6

pewnie źle coś zrobiłem.
Jednak czy możesz pomóc mi w tym kodzie:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

 class ZliczaczLiter {

    public static void main(String[] args) throws IOException 
    {
        BufferedReader in =new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out=new PrintWriter(System.out);
        int n=Integer.parseInt(in.readLine());
       
        int[] znakiA =new int[26];
        int a=97;
            for(int i=0;i<znakiA.length;i++)
            {
                znakiA[i]= a;
                a++;
            }  
        int[] znakiB =new int[26];
        int b=65;
            for(int i=0;i<znakiB.length;i++)
            {
                znakiB[i]= b;
                b++;
            }  
        int licznik=0;
       char [] tablica = new char [1000];
        for(int q=0;q<n;q++)
        {
             String linia=in.readLine().trim();
             tablica= linia.toCharArray();   
        }

           System.out.println();
            for(int i=0; i<znakiA.length;i++)
            {  
                for(int j=0;j<tablica.length;j++)
                { 
                    if( znakiA[i]==tablica[j])
                    {
                        licznik++;  
                    }    
                }
                if(licznik>0)
                {
                    System.out.println((char)znakiA[i]+" "+licznik);
                }
                licznik=0;
            }
            for(int i=0; i<znakiA.length;i++)
            { 
                for(int j=0;j<tablica.length;j++)
                { 
                    if( znakiB[i]==tablica[j])
                    {
                        licznik++; 
                    }    
                }
                if(licznik>0)
                {
                    System.out.println((char)znakiB[i]+" "+licznik);
                }
                licznik=0;
            }
    }
    
}

zliczyć całe wejście czyli 'n' linijek a nie tylko ostatnią.
Jak już ogarnę to, to zajmę się kolekcjami i ogarnę HashMap. Jeszcze raz dzięki.

dodanie znaczników <code class="none"> i wstawienie kodu do posta - @furious programming

0

Cztery posty wyżej pisałeś (i dałeś przykład), że podsumowanie ma być po każdej wczytanej linii. Teraz piszesz, że ma być jedno wyjście. Zdecyduj w końcu jak ma być.
I jeszcze jedno, co program ma zliczać: wszystkie znaki, wszystkie litery, tylko litery angielskie.

0

Przepraszam źle to napisałem.

Podsumowanie ma być jedno.
np
wejscie

3
abc
ac
c

wyjscie

a 2
b 1
c 3

Gdyby podsumowanie było po każdym teście to takie zadanie zrobiłem sam. Mam problem z wprowadzeniem danych i wypisaniem tylko jednego wyniku.

ma zliczać tylko litery angielskie. Tak jak jest w moim kodzie.

dodanie znaczników <code class="none"> - @furious programming

0

jak nie ma utilsów to w java8 można to robić elegancko tak:

    private static Map<Character, Long> countChars(String s) {
        return s.chars().boxed()
                .collect(Collectors.groupingBy(c -> (char) c.intValue(), Collectors.counting()));
    }

:P

1
int[] liczniki = new int[52]; 
for(int q=0;q<n;q++)
{
    String linia = in.readLine().trim();
    char[] tablica = linia.toCharArray();
    for(int j=0;j<tablica.length;j++)
   {
        for(int i=0; i<znakiA.length;i++)
        {                  
            if( znakiA[i] == tablica[j])
            {
                liczniki[i]++;  
            }    
       }
       for(int i=0; i<znakiB.length;i++)
       {                  
            if( znakiB[i] == tablica[j])
            {
                liczniki[i+26]++;  
            }    
      }                
  }            
}
for(int i=0; i<liczniki.length;i++)
{
    if(liczniki[i] > 0)
    {
        if(i<26)
        {
             System.out.println((char)znakiA[i]+" "+liczniki[i]);
        }
        else
       {
             System.out.println((char)znakiB[i-26]+" "+liczniki[i]);
       }
    }
}

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