Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143

    Ordinare lessicograficamente un array di stringhe

    codice:
    public class Array {
    
    	Scanner tast = new Scanner(System.in);
    
    	private String[] elementi;
    	private int numElementi;
    
    	public Array(String[] a, int i) {
    		elementi = a;
    		numElementi = 1;
    	}
    
    public void print() {
    		for (int k = numElementi - 1; k >= 1; k--) {
    			for(int j = 0; j <= k - 1; j++)
    				if(elementi[j].compareTo(elementi[k]) > 0) {
    					String temp = elementi[k];
    					elementi[k] = elementi[j];
    					elementi[j] = temp;
    				}
    		}
    		for(int n = 0; n < elementi.length; n++)
    			System.out.print(elementi[n] + " ");
    }
    }
    Il main è:
    codice:
    import java.util.Scanner;
    
    public class TestArray {
    
    	public static void main(String[] args) {
    
    		Scanner tast = new Scanner(System.in);
    
    		String[] a1 = {"c", "ci", "s", "p", "ca"};
    
    		Array r1 = new Array(a1, 15);
    
    		System.out.print("array ordinato: ");
    		r1.print();
    		System.out.println();
    	}
    }
    Questo metodo dovrebbe stampare un array di stringhe in modo ordinato ma funziona in parte. Ordina tutte le parole tranne l'ultima.
    Es: String[] a1 = {"c", "ci", "s", "p", "ca"};
    Mi stampa: c, ci, p, s, ca.
    Come risolvo?
    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Quel codice è impostato davvero male:
    dichiarare e inizializzare variabili che non usi non è una buona pratica (tast non lo usi).

    Passiamo alla necessità di avere un wrapper per un oggetto come un array che in java ha tutto quello di cui necessita: perchè?

    Poi continua con il costruttore, passi l'array che hai creato, ma poi passi una dimensione (inutile perché l'array se la porta dietro), quindi quella dimensione (per non sbagliare) manco la consideri e metti in numElementi 1, il che significa che il ciclo di ordinamento non è mai eseguito!!!

    Parti sempre da 0, per il ciclo esterno, poi confronta con quelli successivi (da k+1) e vedi che l'algoritmo funziona

    ps guarda che devi fare lo scambio per compare negativo, non positivo (se vuoi l'ordine alfabetico)
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Ok ho risolto, grazie
    Non avevo visto quel problema nel costruttore

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    fai un po di confusione, il numero di elementi un array se lo porta già dietro, non c'è bisogno che lo vai a dire a parte.
    Se lo fai deve essere comunque congruente con quello reale (non metterei mai 15 per quell'array che hai dichiarato!!!).


    Mettiamo il caso che tu avessi chiamato il costruttore con la dimensione giusta, poi comunque a numElementi assegni 1, stai dicendo che il tuo array ha un solo elemento, errato.
    Se a numElementi tu avessi assegnato 15, avresti avuto lo stesso errore (perchè accedevi a posizioni dell'array invalide).

    Ogni array si porta dietro la dimensione per evitare errori di questo tipo e bisogna fare in modo di riferirsi a quella.

    Altra considerazione, amo poco i cicli inversi (in cui parti dalla fine), è facile sbagliare con gli indici e dimenticare qualcosa.
    Tu vorresti prendere l'ultimo e poi confrontarlo con i precedenti partendo da zero, io trovo più semplice prendere un elemento e confrontarlo coi successivi e a meno di confusione, partendo con primoIndice = 0 e secondoIndice = primoIndice+1 e fermandomi in entrambi i casi a array.lenght non mi sono persa indici e confronti e non ho fatto confusione con decrementi.

    Come impostare un ciclo, te ne ho spiegato la logica.
    L'algoritmo (con 2 modifiche) l'ho sistemato, è il bubblesort ed è di facile implementazione.
    RTFM Read That F*** Manual!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.