(Java) problema con iteratori

Discussione in 'Java' iniziata da aduri, 3 Ottobre 2006.

  1. aduri

    aduri Nuovo Utente

    Registrato:
    3 Ottobre 2006
    Messaggi:
    13
    Mi Piace Ricevuti:
    2
    Punteggio:
    0
    Occupazione:
    impiegato/studente
    Località:
    Genova
    Salve a tutti,
    sono qua a chiedere aiuto per la soluzione di questo questo che e' l'ultimo esercizio di preparazione per
    l'esame di java.
    Premetto che il punto 1 e il 2 penso di averlo gia' implementato.

    Il testo originale del prof. e' il seguente:

    1. Definire la classe SortedLinkedList che estende la classe LinkedList e che mantiene ordinata la lista:
    ridefinire il metodo add() affinché inserisca gli elementi in ordine.
    Gli oggetti da inserire devono essere confrontabili e quindi devono implementare l’interfaccia Comparable.
    Si ordini la lista in modo che il valore massimo sia in testa (first) e il valore minimo in coda (last).
    Verificare la correttezza dell’implementazione: per esempio usando sequenze di stringhe in ordine, in ordine inverso,
    casuali, uguali. Verificare con sequenze di 21 elementi Integer casuali, con valori compresi nell’intervallo [-30,30].

    2. Sviluppare una classe Process che descriva un processo. Definire tre campi: un intero che
    identifica il processo (pid), una stringa per il nome del processo e un intero per
    l’occupazione di memoria. Definire il costruttore della classe e il metodo toString().
    Implementare l’interfaccia Comparable: il confronto è fatto sulla memoria utilizzata.

    3. Scrivere una classe (che contiene il main()) in cui creare un oggetto di tipo
    SortedLinkedList, lista di oggetti Process. La sequenza di processi -in ingresso al sistema- è contenuta nel
    file processes.txt: ogni riga contiene i dati di un processo, cioè il pid, il nome e la memoria occupata.
    Eseguire le seguenti operazioni:
    - Leggere una riga del file ed inserire il processo nella lista.
    - Se la quantità di memoria utilizzata da tutti i processi supera un valore di soglia
    (100000) eliminare dalla lista il processo che in quel momento occupa più memoria
    (utilizzare gli iteratori, oggetti Iterator).
    - Salvare su file il numero di processi presenti nel sistema e la quantità di memoria
    utilizzata da tutti i processi in ogni istante (-ad ogni lettura di una riga-).
    Fare i grafici dell’occupazione di memoria e del numero di processi (in ogni istante).
    Commentare.
    Valutare il costo computazionale per mantenere la lista ordinata e per eliminare il processo che occupa più memoria.

    per chiarezza allego anche la classe SortedLinkedList:


    Codice:
    import java.util.*; 
    public class SortedLinkedList extends LinkedList 
    { 
    private static int elementi; 
    public static void main ( String []args ) 
        { 
           if(args.length > 0) 
              elementi = Integer.parseInt(args[0]); 
           else 
             elementi = 21; 
             System.out.println( "Prova su " + elementi + "elementi." ); 
             SortedLinkedList l = new SortedLinkedList(); 
             // riempi la lista di numeri a caso tra -30 e +30 
              ListIterator it_aggiunta = l.listIterator(); 
       Random generatore=new Random(); 
           for ( int i = 0; i < elementi; i++ ) 
           { 
       int segno=generatore.nextInt(2);// 0 o 1 
       int n=generatore.nextInt(31); 
       if(segno==0) 
       l.add(new Integer(- n )); 
       else 
       l.add(new Integer(n)); 
           } 
           // stampa tutti i valori 
           System.out.println( "Collezione completa:" ); 
           stampaCollezione( l ); 
           } 
        private static void stampaCollezione 
                                       ( Collection c ) 
        { 
           Iterator i = c.iterator(); 
           while ( i.hasNext() ) 
           { 
              System.out.println( i.next() ); 
           } 
        } 
        @Override 
     public boolean add(Object o){ 
      Comparable c=(Comparable)o;//bisogna usare il cast a Comparable 
      ListIterator it=listIterator(); 
      Comparable c2=null; 
      if(it.hasNext()) 
       c2=(Comparable)it.next(); 
      else{ 
       it.add(c); 
       return true; 
      } 
      while(it.hasNext() && c2.compareTo(c)>0) //<0 x ordine crescente 
         c2=(Comparable)it.next(); 
      //uscito dal while ho raggiunto la posizione di inserimento perchè il compareTo() non da più <0 
      //ora posso usare per inserire in questa posizione il metodo add di ListIterator ma bisognerebbe 
      //tornare indietro di una posizione per essere sicuri che l'inserimento sia in ordine se il compareTo() >0 
      if(c2.compareTo(c)<0)//>0 x ordine crescente 
      it.previous(); 
      it.add(c); 
      return true; 
     } 
    }
    Questa e' la classe Processo con la classe EsProcesso col main


    Codice:
    import java.util.*; 
    import java.lang.*; 
    import java.io.*; 
    import javax.swing.JOptionPane;//utility pannello di dialogo 
    class Processo implements Comparable{ 
     private int pid; 
     private String name; 
     private int memoria; 
     public Processo(int pid,String name,int mem){ 
      this.pid=pid; 
      this.name=name; 
      memoria=mem; 
     } 
     public int compareTo(Object o){ 
      Processo p=(Processo)o; 
      return this.memoria-p.memoria;//ordina in base alla quantità di memoria in ordine crescente 
     } 
     public String toString(){ 
      return ""+pid+" "+name+" "+memoria; 
     } 
    
     public int GetMemoria(){ 
       return this.memoria; 
    } 
     public void RemoveMaggiore(){ 
     SortedLinkedList lista=new SortedLinkedList();
     Iterator it1=lista.iterator();// in questa riga ho creato un nuovo 
     //l'oggetto iterator it1 che agisce sull'oggetto list di sortedlinkedlist (idem come sopra)
        Processo p = (Processo) it1.next(); // ottengo il processo 
       memoria -= p.memoria;   // aggiorno la memoria occupata 
       // rimuovo il processo dalla lista 
    } 
    
    
     } 
    
     public class EsProcesso{ 
     public static void main(String[] args) throws IOException 
     { 
      //String nomeFile=JOptionPane.showInputDialog("Digita il nome del file da leggere"); 
    //altro modo di input file diretto da codice 
    String nomeFile="processes.txt"; 
    BufferedReader fileLettura=null; 
    SortedLinkedList lista=new SortedLinkedList(); 
    try { 
     try{ 
      fileLettura = new BufferedReader(new FileReader(nomeFile)); 
      String linea=fileLettura.readLine(); 
      while(linea!=null) { 
       String[] tmp=linea.split("\t"); 
       Processo p=new Processo(Integer.parseInt(tmp[0]),tmp[1],Integer.parseInt(tmp[2]));
       lista.add( p); 
       linea=fileLettura.readLine();//per far girare il ciclo 
      } 
     }finally{ fileLettura.close();} 
    }catch(FileNotFoundException e) {// gestisco le eccezioni 
      System.out.println("Il file "+nomeFile + " non esiste o non puo' essere aperto"); 
    }catch(IOException e) { 
      System.out.println("errore di lettura "+e); 
    } 
    Iterator it=lista.iterator(); 
    while(it.hasNext()) 
     System.out.println((Processo)it.next());//cosi puoi vedere tutta la lista 
    // e stampare a video
    } 
    Processo p1= new Processo();// creo nuovo oggetto Processo
    
    // sembra che richieda di implementare il costruttore dell'oggetto
    // ma non e' gia' istanziato come public nella classe processo?
    // sembra che non riconosca i 2 metodi seguenti
    
    while(p1.GetMemoria()>100000){ //che dovrebbe incrementare il metodo GetMemoria()
       // rimuovi il processo che occupa più memoria 
        p1.RemoveMaggiore();    //che dovrebbe incrementare il metodo RemoveMaggiore()
    } 
    }

    Questo e' uno stralcio del file di testo processes.txt

    1 init 272
    2 migratio 0
    3 ksoftirq 0
    4 watchdog 0
    5 migratio 0
    6 ksoftirq 0
    7 watchdog 0
    8 events/0 0
    9 events/1 0
    10 khelper 0
    11 kthread 0
    14 kacpid 0
    104 kblockd/ 0
    105 kblockd/ 0
    108 khubd 0
    162 pdflush 0
    163 pdflush 0
    165 aio/0 0
    164 kswapd0 0
    166 aio/1 0
    259 kseriod 0
    417 ata/0 0
    418 ata/1 0
    424 scsi_eh_ 0
    425 scsi_eh_ 0
    446 kjournal 0
    999 udevd 240
     
    A ottofonsuppost piace questo elemento.
  2. ottofonsuppost

    ottofonsuppost Utente Attivo

    Registrato:
    10 Maggio 2016
    Messaggi:
    170
    Mi Piace Ricevuti:
    13
    Punteggio:
    18
    Qui l'utente chiede di scrivere per lui il PUNTO 3 del COMPITO ASSEGNATOGLI DAL PROFESSORE, ma l'utente non pubblica la sua soluzione, seppur sbagliata. Se non si sanno le istruzioni di JAVA, si fa un corso: oggi ne esistono anche di gratuiti; mentre il FORUM deve essere utilizzato non per farsi fare i compiti gratis, ma per risolvere piccoli intoppi procedurali che risultano ostici, dopo aver letto i MANUALI di UN CORSO GRATUITO JAVA.
    W IL FORUM MR. WEBMASTER !!! e... ABBASSO I FURBACCHIONI !!!

    Quando ne avremo voglia e tempo, utilizzeremo questo PUNTO 3 per fornire il CODICE di implementazione; che ci servirà per esercitazione nel nostro corso gratuito

    Ottofonsuppost e la grande guerra a JAVA - Corso GRATIS per neofiti

    http://forum.mrwebmaster.it/threads...guerra-a-java-corso-gratis-per-neofiti.45758/
     
Sto caricando...

Condividi questa Pagina