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