PDA

View Full Version : (Java) Problema uso compareTo()


aduri
24-08-2006, 11:06
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. :mc:

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(" ");
}
}
Grazie per l'aiuto

andbin
24-08-2006, 11:21
Io ho sviluppato questo codice che mi da errore quando uso compareTo().
memoria è di tipo int ... non un oggetto, non ha metodi!!

return memoria > tmp.memoria ? +1 : memoria < tmp.memoria ? -1 : 0;

aduri
24-08-2006, 13:10
Grazie, :p
mi sei stato di grande aiuto.

Come al solito. :rolleyes:

andbin
24-08-2006, 13:35
Grazie, :p Prego.

Ma ... il codice sopra è ancora incompleto, vero?? Perché non mi sembra che compareTo venga usato.

aduri
24-08-2006, 17:15
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 :confused: .

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 testo originale del prof. x l'ultimo es. e' mil seguente:

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. :doh:

Scusa per la lungaggine

Andrea16v
24-08-2006, 18:06
memoria è di tipo int ... non un oggetto, non ha metodi!!

return memoria > tmp.memoria ? +1 : memoria < tmp.memoria ? -1 : 0;

Non avevo mai visto in un compareTo() un'implementazione con l'uso di ":" e "?". E' un'abbreviazione del classico

if (...) return +1;
else if (...) return -1;
...

?

cionci
24-08-2006, 19:30
Il codice equivalente è questo:

if (memoria > tmp.memoria) return +1;
else if (memoria < tmp.memoria) return -1;
else return 0;

Andrea16v
25-08-2006, 00:23
Il codice equivalente è questo:

if (memoria > tmp.memoria) return +1;
else if (memoria > tmp.memoria) return -1;
else return 0;

Avevo immaginato bene... :D
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?

cionci
25-08-2006, 00:50
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;

Andrea16v
25-08-2006, 01:05
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:

List<Automobile> multati = new ArrayList<Automobile>();
for (Automobile a : parcheggio) {
if (biglietto scaduto) {
multati.add(a);
}
}

Il comando (Automobile a : parcheggio) è un'abbreviazione per la scansione di tutta la struttura dati con un iteratore e clausola hasNext() ?

MEMon
25-08-2006, 01:48
E' come se fai:

for(int i=0;i<parcheggio.size();i++){
if(bigliettoScaduto) multati.add(parcheggio.get(i));
}

cionci
25-08-2006, 10:38
Il comando (Automobile a : parcheggio) è un'abbreviazione per la scansione di tutta la struttura dati con un iteratore e clausola hasNext() ?
Hai mai visto php ? Quello è il classico comando foreach...in pratica per ognuno degli elementi di parcheggio esegui il blocco... Per ogni iterazione in "a" va a finire un elemento di parcheggio... E' una caratteristica di Java 1.5...