Aiutino con interfaccia comparable

di il
6 risposte

Aiutino con interfaccia comparable

Buongiorno a tutti!!

avrei bisogno di un piccolo aiuto sull'interfaccia comparable.

Devo scrivere un piccolo programmino che simuli la gestione a priorità di processi in modo seguente:

1) il processo a priorità maggiore viene eseguito per 10 quanti, oppure il tempo rimanente se questo è
inferiore a 10 quanti; se vi sono più processi con la stessa priorità massima, viene privilegiato quello
con identificativo minore;

2) la priorità del processo è diminuita di una unità e il processo viene rimesso in coda.

In input il programma legge un file .txt con il seguente formato:

identificativo priorità tempo

ad esempio:

1 5 45
2 6 50
3 4 20

E in input deve stampare ad ogni passo :

identificativo priorità iniziale priorità parziale tempo residuo

Questo è quello che ho prodotto, l'idea di fondo è stata immagazzinare tutti i processi in un ArrayList, ordinarlo di volta in volta ad ogni passo sfruttando la compareTo per confrontare le priorità parziali.

Funziona tutto molto bene ma ho solo un problema, non riesco a far si che a parità di priorità parziale si debba privilegiare il processo con identificativo più basso, idee?

CLASSE PROCESSO
public class Process implements Comparable<Process>{
	private int iID;
	private int iPriority;
	private int iTimeExe;
	private int iPriorityPartial;
	
	public Process(int id, int partPriority, int priority, int time){
		this.iID = id;
		this.iPriority = priority;
		this.iPriorityPartial = partPriority;
		this.iTimeExe = time;
	}
	
	public void toPrint(){
		System.out.println(iID + " " + iPriority + " " + iPriorityPartial + " " + iTimeExe);
	}
	
	public int getID(){
		return this.iID;
	}
	
	public void setTimeExe(int t){
		this.iTimeExe = t;
	}
	
	public int getTimeExe(){
		return this.iTimeExe;
	}
	
	public void setPriorityPartial(int p){
		this.iPriorityPartial = p;
	}
	
	public int getPriorityPartial(){
		return this.iPriorityPartial;
	}
	
	public void setPriority(int p){
		this.iPriority = p;
	}
	
	public int getPriority(){
		return this.iPriority;
	}
	
	public int compareTo(Process p){
		return(p.iPriorityPartial - this.iPriorityPartial);
	}	
}
CLASSE SIMULATOR
import java.io.*;
import java.util.*;

public class ProcessSimulator {
	ArrayList<Process> listProcess;

	
	public ProcessSimulator(FileReader file){
		Scanner scan = new Scanner(file);

		int id = 0;
		int prio = 0;
		int time = 0;
		listProcess = new ArrayList<Process>();
		
		while(scan.hasNext()){

			id = scan.nextInt();
			prio = scan.nextInt();
			time = scan.nextInt();
			listProcess.add(new Process(id, prio, prio, time));
		}
		scan.close();
	}
	
	public void StartSilumation(){
		Collections.sort(listProcess);
		
		while(!listProcess.isEmpty()){
			Process p = listProcess.get(0);
			stepSimulation(p);
			p.toPrint();
			if(p.getTimeExe() == 0)
				listProcess.remove(0);
			Collections.sort(listProcess);	
		}
	}
	
	private void stepSimulation(Process p){
		int iExecTime = p.getTimeExe();
		int iPartPriority = p.getPriorityPartial();
		
		if( iExecTime < 10)
			p.setTimeExe(0);
		else
			p.setTimeExe(iExecTime - 10);
		
		p.setPriorityPartial(iPartPriority - 1);
	}
}
CLASSE MAIN PER L'ESECUZIONE DEL PROGRAMMA
import java.io.*;
public class Main {

	public static void main(String[] args) {
		if(args.length != 1){
			System.err.println("Inserisci il numero corretto di parametri (1)");
			System.exit(0);
		}
		
		assert(args.length == 1);
		
		String sFile = args[0];
		
		FileReader file = null;
		
		try{
			file = new FileReader(sFile);
		}catch(Exception e){
			System.err.println("Non riesco ad aprire il file : " + sFile);
			System.exit(0);
		}
		
		ProcessSimulator simulation = new ProcessSimulator(file);
		simulation.StartSilumation();
		
		try{
			file.close();
		}catch(Exception e){
			System.err.println("Non riesco a chiudere il file : " + sFile);
			System.exit(0);
		}
	}
}
Un grazie in anticipo a chi mi darà qualche suggerimento

6 Risposte

  • Re: Aiutino con interfaccia comparable

    DEFA89 ha scritto:


    non riesco a far si che a parità di priorità parziale si debba privilegiare il processo con identificativo più basso, idee?
    	public int compareTo(Process p){
    		return(p.iPriorityPartial - this.iPriorityPartial);
    	}
    Semplicemente devi migliorare il compareTo. Innanzitutto, detto in generale, la sottrazione tra due valori interi non è una ottimissima cosa (c'è il caso estremo di overflow).

    Quando un compareTo/compare deve basarsi su più dati, il confronto va fatto partendo dal dato più "significativo" e andando avanti su altri dati solo finché hai uguaglianza.
    Se una classe Persona ha nome e cognome, tu puoi confrontare prima i cognomi e se uno dei due è minore o maggiore dell'altro, allora hai GIA' il risultato finale. Mentre solo se i cognomi sono uguali, allora vai a confrontare il nome.
  • Re: Aiutino con interfaccia comparable

    Quindi vediamo se ho capito bene, così dovrei risolvere il problema?
    
    public int compareTo(Process p){
    	if(p.iPriorityPartial == this.iPriorityPartial)
    		return (p.iID - this.iID);
    	else
        	        return(p.iPriorityPartial - this.iPriorityPartial);
       }
    
    Come potrei fare allora il confronto se non con numeri interi?
  • Re: Aiutino con interfaccia comparable

    Se ci fosse una classe Persona, con nome (String), cognome (String) e annoNascita (int), il compareTo potrei farlo così:
    public int compareTo(Persona altraPersona) {
        int r = getCognome().compareTo(altraPersona.getCognome());
    
        if (r == 0) {
            r = getNome().compareTo(altraPersona.getNome());
    
            if (r == 0) {
                r = Integer.compare(getAnnoNascita(), altraPersona.getAnnoNascita());
            }
        }
    
        return r;
    }
    Nota che il compare statico di Integer è un metodo di "utilità" introdotto in Java 7 ed è appunto utile per comparare interi senza fare la sottrazione.

    Vedi bene come i confronti sono in "cascata"?
  • Re: Aiutino con interfaccia comparable

    Così???
    
    public int compareTo(Process p){
    		int c = Integer.compare(p.getPriorityPartial(), this.getPriorityPartial());
    		if(c == 0){
    			c = Integer.compare(p.getID(), this.getID());
    		}
    		return c;
    	}
    
    Grazie mille per le risposte
  • Re: Aiutino con interfaccia comparable

    DEFA89 ha scritto:


    
    public int compareTo(Process p){
    		int c = Integer.compare(p.getPriorityPartial(), this.getPriorityPartial());
    		if(c == 0){
    			c = Integer.compare(p.getID(), this.getID());
    		}
    		return c;
    	}
    
    Tecnicamente è corretto. Però ... così l'ordine è per priorità discendente (una priorità maggiore viene prima, ok) e poi per Id discendente (Id maggiore viene prima).

    Ma tu non volevi "a parità di priorità parziale si debba privilegiare il processo con identificativo più basso" ?
  • Re: Aiutino con interfaccia comparable

    Si ho fatto copia e incolla della riga sopra e ho lasciato l'ordine degli oggetti della riga di sopra, ora ho invertito e funziona!!

    Sei stato gentilissimo, disponibilissimo e chiarissimo!! (manca solo levissimo ahahah )

    Grazie mille e buona giornata.
Devi accedere o registrarti per scrivere nel forum
6 risposte