Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    15

    cancellazione record con iteratori

    Dovrei caricare il file composto da record ognuno dei quali composto di 3 campi di cui l'ultimo e' la dimensione della memoria.
    La richiesta e' caricare il file, ordinarlo per dimensione memoria in ordine crescente e quando si raggiungono 100000 di somma di memoria occupata il processo che ha maggiore occupazione di memoria va eliminato.
    Il programma compila fino all'ordinamento della lista in ordine crescente e mi da errore quando carico la classe ScanDeleteLast che dovrebbe rimuovere con gli iteratori (come richiesto dal prof.) l'ultimo record.
    Non ho ancora implementato il controllo sulla somma di memoria.
    Qualcuno mi puo' dare una dritta?
    ecco il codice

    A presto




    codice:
    import java.util.*;
    import java.io.*;
    import javax.swing.JOptionPane;//utility pannello di dialogo
     
    class MyFile {
     public int memoria;
     public int pid;
     public String nome;
     
     MyFile (String linea)
     {
      String aTmp[] = linea.split("\t");
      this.memoria = Integer.parseInt(aTmp[2]);
      this.nome = aTmp[1];
      this.pid = Integer.parseInt(aTmp[0]);
     }
    
     MyFile (int memoria, String nome)
     {
      this.pid = pid;
      this.memoria = memoria;
      this.nome = nome;
     }
     
     public static void main(String[] args) throws IOException
     {
      Keymemoria keymemoria = new Keymemoria();
     // KeyNome keyNome = new KeyNome();
      Vector v = new Vector();// creo Vector (array dinamico)
      // Carico file da processes.txt 
    //String nomeFile=JOptionPane.showInputDialog("Digita il nome del file da leggere");
    String nomeFile="processes.txt";  //altro modo di input file diretto da codice
      
      BufferedReader fileLettura;
     
      try {   
       fileLettura = new BufferedReader(new FileReader(nomeFile));
       while(true) {
        String linea = fileLettura.readLine();
        if(linea==null) {
         break;
        } else {
         v.add( new MyFile(linea) );
        }
       }
      } 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); 
      }
     
      MyFile[] a = new MyFile[v.size()];
      for( int i = 0; i < v.size(); i++ ) {
       a[i] = (MyFile)v.get(i);
      }
     System.out.println ("------------------");
      System.out.println ("Array non ordinato: ");
      System.out.println ("pid  nome  memoria");
      for (int k = 0; k < a.length; k++) {
       System.out.println (a[k].pid + " " + a[k].nome+ " " + a[k].memoria);
       
      }
     System.out.println ("------------------");
      System.out.println ("Array ordinato rispetto alla dimensione della memoria: ");
      System.out.println ("pid  nome  memoria");
      Arrays.sort (a, keymemoria);
      for (int k = 0; k < a.length; k++) {
       System.out.println (a[k].pid + " " + a[k].nome+ " " + a[k].memoria);
       
      }
     System.out.println ("------------------");
      //Implemento la ricerca binaria per dimensione
      System.out.println ("");
    
      }
    }
     
    class Keymemoria implements Comparator {
     public int compare (Object MyFile1, Object MyFile2)
     {
      int memoria1 = ((MyFile) MyFile1).memoria;
      int memoria2 = ((MyFile) MyFile2).memoria;
      return (memoria1 < memoria2 ? -1 : (memoria1 == memoria2 ? 0 : 1));
      }
    }
     
       public class ScanDeleteLast {
        SortedLinkedList l = new SortedLinkedList();
             ListIterator it = l.listIterator();
            for ( int i = 0; i < l.lenght; i++ )
      {      
    while(it.hasNext()) {
          String item = (String) l.next();  
            }
     // toglie l’ultimo elemento traversato
      it.remove(); // rimuove record con memoria maggiore     
      
      } 
    }

    Questo e' uno stralcio del file 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
    1603 kjournal 0

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    15
    Ho rivoluzionato il codice ma ho problemi ad approcciare la soluzione dell'eliminazione del record .

    Ho creato una classe EsProcess che legge i record simili a processes e li ordina in modo decrescente.
    Questo mi complica la vita perche' nell'ordinamento crescente con un controllo con
    while(it.hasNext()) raggiungevo il fondo della lista e rimuovevo.
    In questo caso col record con memoria piu' grande in cima alla lista diventa piu' complicato.
    Per cio' che riguarda la somma della memoria preferirei non inquinare la classe sortedlinkedlist (inserendo una variabile che conti la memoria) e
    creare un metodo sumMem all'interno di EsProcess ma ho difficolta' ad implementarlo.
    La classe SortedLinkedList l'avevo gia' implementata precedentemente (era argomento di un altro post) e l'allego:

    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;
    }
    }

    il codice che ho implementato per l'ultimo esercizio e':


    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 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]));//mi ero dimenticato io 
       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 
    } 
    }

    Scusate per la lungaggine

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    15
    Il problema dell'iterator alla fine e' una banalita' in quanto facendo it.next() una volta istanziato l'oggetto iterator it vado proprio sul primo record e lo posso cosi' rimuovere con it.remove().
    Il problema e' creare un metodo che mi sommi la memoria dell'oggetto p e che controlli di non aver superato 100000 ed a questi punti dovrei creare un nuovo ogetto iterator it1 fare it1.next() (per tornare in cima alla lista) e poi it1.remove().

    Ho provato a creare un metodo subito dopo il compareTo(Object o)
    public int sumMem(Object o){
    Processo p=(Processo)o;
    return p.memoria;//ritorna il valore della memoria del record


    e dopo aver istanziato l'oggetto iteratore it

    it.next();
    int a = p.memoria;
    System.out.println("valore memoria"+a);

    ma non compila da errore in p.memoria.

    Dove sbaglio??

    Ancora un po' di pazienza
    Grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    15
    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.

    Nei precedenti post ero stato un po' confusionario e non avevo posto il problema in maniera comprensibile quindi allego il testo originale del prof. che 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 
    } 
    }
    codice:
    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

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.