|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2005
Città: Genova
Messaggi: 75
|
(Java) Problema uso compareTo()
Salve a tutti,
Il testo del problema posto dal prof. e' il seguente: 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. Io ho sviluppato questo codice che mi da errore quando uso compareTo(). Mi ci sto picchiando da parecchio ma non riesco a capire dove sbaglio. Codice:
import java.util.*;
import java.lang.*;
class Process implements Comparable
{
int pid;
String nome;
int memoria;
public Process(int pid, String nome, int memoria) //costruttore
{
this.pid= pid;
this.nome = nome;
this.memoria = memoria;
}
public void StampaDettagli()
{
System.out.println("Processo "+pid+" Nome " + nome + " Memoria " + memoria);
}
public String toString()
{
return nome + " " + pid+" "+memoria;
}
public int compareTo(Object o){
Process tmp = (Process) o;
return memoria.compareTo(tmp.memoria);
}
// private int pid;
// private String nome;
// private int memoria;
}
public class UsoProcess
{
public static void main(String args[])
{
Process[] proc = new Process[3];
proc[0] = new Process(2,"integer", 1500);
proc[1] = new Process(6,"calc", 2500);
proc[2] = new Process(4,"sum", 2500);
System.out.println("===================");
System.out.println("Situazione processi");
System.out.println(" ");
for (int i = 0; i < 3; i++)
{
proc[i].StampaDettagli();
}
System.out.println(" ");
System.out.println(" ");
System.out.println(" ");
}
}
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
return memoria > tmp.memoria ? +1 : memoria < tmp.memoria ? -1 : 0;
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Nov 2005
Città: Genova
Messaggi: 75
|
Grazie,
mi sei stato di grande aiuto. Come al solito. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Ma ... il codice sopra è ancora incompleto, vero?? Perché non mi sembra che compareTo venga usato.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Nov 2005
Città: Genova
Messaggi: 75
|
Dal testo del professore non riesco bene ad interpretare quello che vuole.
Dice pero' che il confronto va fatto sulla memoria e nell'esercizio successivo fa diverse richieste che ancora non ho capito come impostare. E' l'ultimo esercizio ma, per le mie scarse capacita', il piu' complicato. Ho anche implementato con successo (dopo parecchi rifacimenti) una classe SortLinkedList che allego per completezza e che deve essere richiamata 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;
}
}
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. Scusa per la lungaggine |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 3852
|
Quote:
if (...) return +1; else if (...) return -1; ... ?
__________________
Cerco fotocamera con buono zoom!! CLICCA! ° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) ° |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Il codice equivalente è questo:
if (memoria > tmp.memoria) return +1; else if (memoria < tmp.memoria) return -1; else return 0; Ultima modifica di cionci : 25-08-2006 alle 00:50. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 3852
|
Quote:
Abbreviare questa operazione è una gran cosa, anche perchè è un metodo molto frequente, ma ci sono motivi particolari per l'adozione di questi comandi (":" e "?") come abbreviazione?
__________________
Cerco fotocamera con buono zoom!! CLICCA! ° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) ° |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No, non ce n'è alcuno, ma a volte fa davvero comodo...
Concatenare più volte l'operatore ternario non mi piace molto, ma a volte mi piace molto usarlo... Ad esempio in questi casi è perfetto e secondo me leggibilissimo: if(a == b) return 1; else return 0; che si sostituisce con: return (a == b) ? 1 : 0; Oppure: if(a == c) b = 1; else b = 0; che si sostituisce con: b = (a == c) ? 1 : 0; |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 3852
|
Questi ultimi li trovo un po' ostici da digerire, me li segno così se li dovessi incocciare da qualche parte me li vengo a vedere, bisogna un po' calarsi nel ruolo per saperli riconoscere senza appunti davanti..
Se invece dico, per esempio con una lista parcheggio di oggetti automobile: Codice:
List<Automobile> multati = new ArrayList<Automobile>();
for (Automobile a : parcheggio) {
if (biglietto scaduto) {
multati.add(a);
}
}
__________________
Cerco fotocamera con buono zoom!! CLICCA! ° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) ° |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
E' come se fai:
Codice:
for(int i=0;i<parcheggio.size();i++){
if(bigliettoScaduto) multati.add(parcheggio.get(i));
}
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:17.



















