Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Esercizio programmazione II

    Ho questo esercizio:

    "Sia dato un file di input contenente un insieme di numeri interi. Ogni numero
    occupa una riga del file ed č costituito da non pių di 500 cifre.
    Scrivere un programma Java che prenda in input tale file e scriva in un file di
    output il pių grande tra i numeri individuati."

    Ora il problema č che il file contiene righe con numeri pių grandi di int long e qualunque altro tipo primitivo, ho pensato di confrontarli come stringhe, il fatto č che dovrei inserirli in un array di stringhe, ma dovrei leggere una volta il file per sapere il numero di righe, e poi leggerlo una seconda volta per memorizzare le stringhe. Mi chiedevo come fare per evitare di leggere pių volte un file, ho letto del metodo mark() della classe BufferedReader, ma non mi funziona, mi viene sempre invalidata la marcatura,vi posto il mio codice e vi chiederei di spiegarmi come usare questo metodo o risolvere il problema eventualmente.

    codice:
    import java.io.*;
    
    public class EsercizioVI
    {
    	public static void main(String [] args) throws IOException
    	{
    	
    	FileReader reader=null;
    	
    	PrintWriter out=null;
    	
    	BufferedReader in=null;
    	
    	try{
    		reader=new FileReader("input.txt");
    		in=new BufferedReader(reader);
    		out=new PrintWriter("OUTPUT.txt");
    		int righe=0;
    		String max="";
    	
    		
    		        in.mark(0);                            //inizializzo mark a 0 per ricominciare da 0 la lettura
    			while(in.readLine()!=null){
    						righe++;
    							     }
    			in.reset();                                //resetto per potere rileggere
    							
    								
    			String [] str=new String[righe];
    		
    							     
    			for(int i=0; i<str.length; i++)               //assegno ai vari elementi dell'array le stringhe
    				str[i]=in.readLine();
    							     
    			max=str[0];
    			
    		
    			for(int i=0; i<str.length-1; i++)
    			{
    				for(int j=i+1; j<str.length; j++)            
    				{
    					if(max.length()<str[j].length())              //confronto i numeri tramite lunghezza delle stringhe.
    						max=str[j];
    					if(max.length()==str[j].length())
    					{
    						int cont=0;                            
    						boolean uguali=true;
    						
    						while(uguali==true)
    						{
    							if(max.charAt(cont)>str[j].charAt(cont))            //se le stringhe hanno la stessa lunghezza tramite charAt vedo quale ha un numero maggiore.
    								uguali=false;
    							if(max.charAt(cont)<str[j].charAt(cont))
    							{
    								uguali=false;
    								max=str[j];
    							}
                                                                                      cont++;
    						}
    					}
    				}
    			}
    			out.print(max);
    		
    		}

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Secondo me ti stai complicando inutilmente la vita... io la vedo cosė:

    - ok per il BufferedReader e visto che il file č espressamente strutturato con un elemento per riga va bene anche il metodo di lettura a righe;

    - l'algoritmo come lo vedo io: prendo il primo elemento del file (br.readLine()) e lo considero il mio max. Nel ciclo while leggo il resto del file, e confronto ogni nuova riga letta con il mio elemento pivot... se la riga appena letta č pių lunga del pivot, allora questa riga sarā il mio nuovo pivot, se pių corta proseguo nella lettura, se di lunghezza uguale... compareTo di String mi dirā qual č il pių grande.

    Qualcosa del genere

    codice:
    private String compare (String max, String current) {
            if (max.length() > current.length()) {
                return max;
            }
            else {
                return (max.compareTo(current) < 0 ? current : max);
            }
        }
    
        public String max() {
            String max = null;
            try {
                BufferedReader br = new BufferedReader(new FileReader(f));
                max = br.readLine();
                String current = "";
                while ((current = br.readLine()) != null) {
                    max = compare(max, current);
                }
    
            }
            catch (Exception e) {
                e.printStackTrace();
            }      
            return max;
        }
    <´¯)(¯`¤._)(¯`ģANDREAĢ´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Io ho scritto questo:

    codice:
    import java.io.*;
    
    public class EsercizioVI
    {
    	public static void main(String [] args) throws IOException
    	{
    	
    	FileReader reader=null;
    	
    	PrintWriter out=null;
    	
    	BufferedReader in=null;
    		
    		
    		
    		
    	try{
    			reader=new FileReader("input.txt");
    			in=new BufferedReader(reader);
    			out=new PrintWriter("OUTPUT.txt");
    		
    		String max=in.readLine();
    		
    		while(in.readLine()!=null)
    		{
    			String current=in.readLine();
    			System.out.println(current);
    			if(max.length()<current.length())
    			
    			max=current;
    			
    				
    			if(max.length()==current.length())
    			{
    				int compare=max.compareTo(current);
    				if(compare==-1)
    					max=current;
    			
    			}
    		}
    		out.print(max);
    		
    		
    		
    		}
    
    		
    			finally{
    				if(reader!=null)reader.close();
    				if(in!=null)in.close();
    				if(out!=null)out.close();
    				}
    	}
    				
    }
    Ma non funziona, non capisco perchč la lettura salta un rigo si e uno no.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Darčios89
    codice:
    		String max=in.readLine();
    		
    		while(in.readLine()!=null)
    		{
    			String current=in.readLine();
    non capisco perchč la lettura salta un rigo si e uno no.
    Mi pare evidente: il readLine() č nel test del while ma č anche nel corpo del while.

    L'uso "tipico" generalmente č:

    codice:
    String linea;
    
    while ((linea = br.readLine()) != null) {
        ......
        // usa linea ( ... non rileggi con readLine()!)
    }
    Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet

  5. #5
    Ah certo, che stupido, perō devo fare qualche errore di logico perchč il risultato non coincide con il massimo.

    codice:
    import java.io.*;
    
    public class EsercizioVI
    {
    	public static void main(String [] args) throws IOException
    	{
    	
    	FileReader reader=null;
    	
    	PrintWriter out=null;
    	
    	BufferedReader in=null;
    		
    		
    		
    		
    	try{
    			reader=new FileReader("input.txt");
    			in=new BufferedReader(reader);
    			out=new PrintWriter("OUTPUT.txt");
    		
    		String max=in.readLine();
    		String current="";
    		
    		while((current=in.readLine())!=null)
    		{
    			//System.out.println(current);
    			
    			if(max.length()==current.length())
    			{
    				
    				int compare=max.compareTo(current);
    				if(compare==-1)
    					max=current;
    			
    			}
    	
    			if(max.length()<current.length())
    			
    			max=current;
    				
    		}
    			out.print(max);
    
    		}
    
    		
    			finally{
    				if(reader!=null)reader.close();
    				if(in!=null)in.close();
    				if(out!=null)out.close();
    				}
    	}
    				
    }
    Sto provando a cercare l'errore..........

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Darčios89
    Ah certo, che stupido, perō devo fare qualche errore di logico perchč il risultato non coincide con il massimo.
    Stai comparando i numeri (che nel file sono sequenze di caratteri '0'-'9') come stringhe. Infatti per esempio "3" č maggiore di "10" !! (secondo la comparazione "lessicografica" delle stringhe)

    Devi parsare le stringhe con Integer.parseInt(str) in modo da avere il valore numerico, quindi poi la comparazione diventa banale.
    Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    tutto quello che dice andbin č corretto (come sempre daltronde, č una fonte autorevolissima). Non vuoi passare da Integer (o BigInt, per valori che eccedono la capacitā di int)? Bene, devi comunque LEGGERE la documentazione di compareTo di String.

    Non c'č scritto da nessuna parte che ritorni -1 se una String č "minore" (viene prima, lessicograficamente) di un'altra... quello che dice la documentazione č:

    compareTo restituirā:
    - valore negativo, se la stringa viene prima
    - zero, se si stanno comparando stringhe uguale
    - valore positivo, se la stringa viene dopo

    Metti insieme questo con: se una stringa contiene un numero (senza pugnette tipo mille cifre 0 iniziali) ovviamente conterrā un valore pių grande se pių lunga di un'altra stringa contenente un numero e ottieni il codice che ho postato sopra. Se vuoi fare tutto nel main, senza crearti un metodo accessorio:

    codice:
    public static void main (String[] args) {
            String path = "C:/Users/Andrea/Desktop/numbers.txt";
            String max = null;
            try {
                BufferedReader br = new BufferedReader(new FileReader(new File(path)));
                String current = "";
                max = br.readLine();
                
                while ((current = br.readLine()) != null) {
                    max = (max.length() < current.length() ? current :
                          (max.length() == current.length() && (max.compareTo(current) < 0) ? current : max));
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(max);
        }
    Dove in path metterai il percorso al tuo file di testo.
    <´¯)(¯`¤._)(¯`ģANDREAĢ´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  8. #8
    Si perō c'č un problema, i numeri che ho non possono essere convertiti, perchč sono anche di 500 cifre quindi non ci stanno in un intero.
    Sono disperato...

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Originariamente inviato da Darčios89
    Si perō c'č un problema, i numeri che ho non possono essere convertiti, perchč sono anche di 500 cifre quindi non ci stanno in un intero.
    Sono disperato...
    in veritā si potrebbe:
    http://java.sun.com/javase/6/docs/ap...igInteger.html

    anche di 50000000 cifre se ti va...
    <´¯)(¯`¤._)(¯`ģANDREAĢ´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  10. #10


    Funziona..........in pochissime righe, comincio a pensare che non sarō mai un programmatore.....

    Perō mi dovreste fare un ultimo favore, purtroppo il nostro docente non ci ha speigato quella sintassi che tu usi nel while, vorrei chiederti di farmi capire che cosa hai scritto perchč non capisco ciō che c'č nel while.

    codice:
    while ((current = in.readLine()) != null) {
    				max = (max.length() < current.length() ? current :
    				(max.length() == current.length() && (max.compareTo(current) < 0) ? current : max));
    				}
    Allora, finchč current non č null e stiamo leggendo, a max assegno.....ecoc mi sono perso

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.