Inizializzare matrice caratteri

di il
12 risposte

Inizializzare matrice caratteri

NetBeans mi da errore e non saprei come fare... Spero che dal codice si capisca che voglio fare
char matrice[0][] = {'?', '?', '?', '?', '?', 'ƒ', '?', '?','?', '?', '?', 
        '?' '?' '?' 'o' '?' '?' '?' '?' '?' '?' 'v' '?' '?' '?' '?'};
        matrice[1][] = {'a', '?', 'c', '?', 'e', 'f', 'g', '?', 'i', 'j', '?', 
        'l', '?', 'n', 'o', '?', '?', 'r', 'š', 't', 'u', '?', 'w', '?', '?', 'ž'};
Sapete aiutarmi?

12 Risposte

  • Re: Inizializzare matrice caratteri

    lolol ha scritto:


    NetBeans mi da errore e non saprei come fare... Spero che dal codice si capisca che voglio fare
    char[0][] denota un array bidimensionale. Quindi, se ho capito bene, vuoi fare un array con 2 "righe" in cui ciascuna ha il blocco di quei caratteri?
  • Re: Inizializzare matrice caratteri

    Intendo la matrice come più array messi insieme e questo è quello che vorrei fare ...
  • Re: Inizializzare matrice caratteri

    lolol ha scritto:


    intendo la matrice come più array messi insieme e questo è quello che vorrei fare ...
    Se vuoi fare un array bidimensionale allora è così:
    char[][] matrice = {
        { '?', '?', '?', '?', '?', 'ƒ', '?', '?', '?', '?', '?',
          '?', '?', '?', 'o', '?', '?', '?', '?', '?', '?', 'v', '?', '?', '?', '?' },
        { 'a', '?', 'c', '?', 'e', 'f', 'g', '?', 'i', 'j', '?',
          'l', '?', 'n', 'o', '?', '?', 'r', 'š', 't', 'u', '?', 'w', '?', '?', 'ž' }
    };
    Nota che quando si inizializza l'array con dei valori tra { } non bisogna mettere una dimensione in [ ] perché è il compilatore che determina la dimensione deducendola dal numero di valori presenti.
    Dal momento che ci sono 2 sotto-array, l'array principale ha dimensione 2 e ciascun sotto-array ha dimensione 26.
    Quindi in una espressione matrice[y][x], y può essere da 0 a 1 mentre x da 0 a 25.

    NOTA finale: hai usato caratteri particolari, non ASCII. Va bene. Tieni solo presente che il file sorgente deve essere codificato con un charset che sia in grado di rappresentare tutti quei caratteri (preferibilmente UTF-8). E il compilatore deve essere informato del fatto che il sorgente da compilare è es. in UTF-8.
    Quando si compila "a mano" con i tools del JDK, questo non è così "scontato", va fatto e controllato esplicitamente. Da un IDE (es. NetBeans nel tuo caso) generalmente la cosa è più automatica/implicita nel senso che l'IDE può già avere un buon default che potrebbe essere appunto UTF-8 o magari ISO-8859-1.
    In Eclipse basta andare su un file del progetto e fare: tasto destro mouse -> Properties e nella dialog c'è la indicazione del charset usato dal file. In NetBeans sarà una cosa simile ... presumo ... (non lo uso).
  • Re: Inizializzare matrice caratteri

    Eh ad essere sincera non ho capito gran che della spiegazione, ma non fa niente col tempo capirò.
    L'esempio che hai messo era esattamente quello che intendevo, GRAZIE MILLE!
    Poi già che ci sono faccio un'altra domanda
    sempre con un array bidimensionale, facciamo che è quindi un array formato da più linee ... come posso fare in modo che queste linee abbiano tutte una lunghezza diversa?
    Tipo così:
    OOOOOOOO
    OOO
    OOOOOO
    OOOOOOOOOOOO
    OOOOO


    per dire eh, è solo una curiosità personale


    e mi è venuto in mente... tipo mettiamo che la prima riga della matrice è lunga 5 un'altra 9 ecc. Se io voglio fare un for dove guardo solo una linea di matrice come faccio a dirgli la lunghezza di quella specifica riga. So che è spiegato male ma non so come dirlo meglio ...
    Tipo array.length ma con una riga di matrice ..
    for(i=0;i<vettore.length;i++){
    }

    al posto di vettore.length che metto per una riga di matrice?
  • Re: Inizializzare matrice caratteri

    lolol ha scritto:


    Eh ad essere sincera non ho capito gran che della spiegazione, ma non fa niente col tempo capirò.
    Se intendi la spiegazione sulle questioni relative ai charset ... ok. Non credo comunque sia un grosso problema visto che sviluppi con un IDE.

    Ma ricordati che se inserisci caratteri "particolari" (non ASCII) dentro un sorgente, un minimo di attenzione ci vuole! E questo vale soprattutto, specialmente, se si sta usando un comune text editor e si compila direttamente con i tools del JDK.

    lolol ha scritto:


    Poi già che ci sono faccio un'altra domanda
    sempre con un array bidimensionale, facciamo che è quindi un array formato da più linee ... come posso fare in modo che queste linee abbiano tutte una lunghezza diversa?
    Tipo così:
    OOOOOOOO
    OOO
    OOOOOO
    OOOOOOOOOOOO
    OOOOO
    In Java gli array multi-dimensionali sono semplicemente "array di array". Ovvero un array principale che contiene riferimenti ad altri array, ecc....
    Pertanto è possibile creare gli array detti "jagged" (frastagliati, irregolari). Esempio con valori literal:
    char[][] matrice = {
        { 'a' },
        { 'b', 'c', 'd', 'e' },
        { 'f', 'g', 'h' }
    };
    matrice.length vale 3 (l'array principale), poi matrice[0].length vale 1, matrice[1].length vale 4 ecc..
  • Re: Inizializzare matrice caratteri

    Grazie mille !!
  • Re: Inizializzare matrice caratteri

    Qualcuno conosce anche un modo per accorciare questo codice:
    nome = nome + input.charAt(i);
    tipo al posto di a=a+1 si fa a++, c'è un modo per fare anche quello che ho messo nel codice?
  • Re: Inizializzare matrice caratteri

    lolol ha scritto:


    qualcuno conosce anche un modo per accorciare questo codice:
    nome = nome + input.charAt(i);
    tipo al posto di a=a+1 si fa a++, c'è un modo per fare anche quello che ho messo nel codice?
    Se nome è appunto un String, di per sé è corretto e sufficiente:
    nome += input.charAt(i);


    Il punto è un altro, comunque. Che tu usi + oppure l'operatore di assegnamento "composto" += , quello che viene sfruttato è il concetto di concatenazione delle stringhe, che è relativamente inefficiente perché sotto sotto va a creare un StringBuffer (StringBuilder da Java 5), appendere i due (o N in generale se l'espressione è fatta con più + ) operandi e poi creare un nuovo String con il risultato.

    Se lo fai una o poche volte, ok. Se invece lo fai in un loop e la stringa si allunga di un carattere per volta ripetendolo magari migliaia e migliaia di volte ... no, è inefficiente. A quel punto è preferibile usare direttamente StringBuffer/StringBuilder.
  • Re: Inizializzare matrice caratteri

    andbin ha scritto:


    lolol ha scritto:


    nome += input.charAt(i);
    Eppure mi viene sbagliato, prova a farlo andare mi da sbagliato il soprannome
    package vacanze_estive_5;
    
    /**
     *
     * @author OOO
     */
    import javax.swing.*;
    
    public class Vacanze_estive_5 {
    
        public static void main(String[] args) {
            boolean b = false;
            String input = JOptionPane.showInputDialog("Inserisci nome e cognome "
                    + "con uno o più spazi a separarli.");
            String nome = "";
            String cognome = "";
            String nick = JOptionPane.showInputDialog("Inserisci il soprannome anche "
                    + "separato da uno o più spazi.");
            String nick2 = "";
            int i;
            int c = 0;
    
            for (i = 0; i < input.length(); i++) {
                if (input.charAt(i) != ' ') {
                    nome += input.charAt(i);
                    b = true;
                } else if (b) {
                    c = i;
                    i = input.length();
                }
            }
            for (i = c; i < input.length(); i++) {
                if (input.charAt(i) != ' ') {
                    cognome += input.charAt(i);
                }
            }
            for (i = 0; i < nick.length() - 1; i++) {
                if (nick.charAt(i) != ' ' && nick.charAt(i + 1) == ' ') {
                    nick2 += nick.charAt(i) + ' ';
                } else if (nick.charAt(i) != ' ') {
                    nick2 += nick.charAt(i);
                }
            }
    
            if (nick2.charAt(nick2.length() - 1) == ' ') {
                nick2 = nick2.substring(0, nick2.length() - 2);
            }
    
            System.out.println(nome + "(" + nick2 + ")" + cognome);
        }
    }
    
    in pratica ad esempio se scrivi in nomeCognome " mario rossi " e in nick " questo è il nick " dovrebbe stamparti alla fine
    "mario (questo è il nick) rossi"
    eppure nel nick mi mette dei numeri ... Dove sbaglio?
    E magari come al solito se conosci modi per migliorare il codice che ho messo ...
    E già che ci sono aggiungo un'altra domanda: Cos'è lo string pool?
    E pio c'è un altro modo per inserire un input? Al posto che usare JOptionPane.showInputDialog(...);
    ?
  • Re: Inizializzare matrice caratteri

    lolol ha scritto:


    in pratica ad esempio se scrivi in nomeCognome " mario rossi " e in nick " questo è il nick " dovrebbe stamparti alla fine
    "mario (questo è il nick) rossi"
    eppure nel nick mi mette dei numeri ... Dove sbaglio?
    Innanzitutto la logica che estrae i vari dati dalle due stringhe non mi sembra (ad occhio) corretta e nemmeno molto sensata.
    Tieni poi presente che fare:

    nick2 += nick.charAt(i) + ' ';

    è tradotto dal compilatore in:

    nick2 = nick2 + (nick.charAt(i) + ' ');

    Nota le parentesi. Un char più un char .... non fa un String, fa un int! (con la somma dei valori numerici dei due char).

    lolol ha scritto:


    E magari come al solito se conosci modi per migliorare il codice che ho messo ...
    Sì, puoi evitare tutta quella logica un po "fumosa". Usa StringTokenizer ad esempio.

    lolol ha scritto:


    E già che ci sono aggiungo un'altra domanda: Cos'è lo string pool?
    Detto in modo semplice e senza voler ora andare in profondità: il "string constant pool" è un'area di memoria in cui la JVM tiene tutte le stringhe "letterali".

    Es. in un sorgente:
    String s = "pippo";

    "pippo" andrà a finire nel string constant pool.

    Se più avanti nel sorgente metti un'altra variabile es.:

    String s2 = "pippo";

    s2 non farà riferimento ad un nuovo oggetto String .... è lo stesso identico riferimento String di quel "pippo" letterale visto prima. Cioè nel string constant pool c'è un solo "pippo".

    lolol ha scritto:


    E pio c'è un altro modo per inserire un input? Al posto che usare JOptionPane.showInputDialog(...);
    ?
    A livello di GUI quello che hai usato, cioè JOptionPane, è il modo più semplice in assoluto.
    Se ti basta l'input da standard-input, cioè da una comune "console", allora puoi usare java.util.Scanner collegato a System.in.
  • Re: Inizializzare matrice caratteri

    lolol ha scritto:


    " mario rossi " e in nick " questo è il nick " dovrebbe stamparti alla fine
    ?
    non mi spedisce il messaggio correttamente . Comunque immaginati che tra le doppie virgolette e maria ci siano più spazi e tra mario e rossi ci siano più spazi e tra rossi e le virgolette a lui successive ci siano più spazi. Stesso con "questo è il nick"
  • Re: Inizializzare matrice caratteri

    Ti ringrazio molto! Adesso man mano mi metto a guardare le cose che m'hai detto. Molto gentile
Devi accedere o registrarti per scrivere nel forum
12 risposte