stampare 3 elementi maggiori di un vettore in input

  • Creatore Discussione Creatore Discussione feys88
  • Data di inizio Data di inizio

feys88

Nuovo Utente
21 Set 2009
3
0
0
ho questo problema:
se l'array è composto da : 2,10,8,7,1,12,2
allora deve stampare: 12,10,8

ecco il codice Java:
Codice:
import java.util.*;

public class Max_tre {

	public static void main(String [] args){

		Scanner in=new Scanner (System.in);
		int A[]=new int [100];
		boolean flag=true;
		int i=0;
			while (flag){
				int n=in.nextInt();
				
				if (n<0){
				   flag=false;
				    break;
				}
				A[i++]=n;
			}
		// copio in un altro vettore per non modificare l'originale
	            int V[]=A.clone(); 
			find_max(A,V,A.length);
			
	}
	
	
	public static void find_max(int A[],int V[],int n){
		
		int find;
		int flag=1;
		for (int i=0;i<n-1;i++){
			 
			if (flag<=3){
			     find=Max_num(V,n,i);
			     System.out.println(find);
			     cancella(V,n,i);
				flag++;
			}	
		}
		
	
	}
	public static void cancella (int V[],int n,int i){
	

		for (int j=0;j<n;j++){
			if (i==j) {
				Valore v1 = new Valore(V[i]);
       				 Valore v2 = new Valore(V[j+1]);
				 delete(v1,v2);
			}
			
			
		}
	}
	public static void delete(Valore a,Valore b){
		
		
		int t = a.val;
        	a.val = b.val;
       	        b.val = 0;
		
	}

	
	public static int Max_num(int V[],int n,int i){

		int max=V[i];
		for (int j=0;j<n;j++){
			if (V[j]>max)
			max=V[j];
		}
		return max;
	}

	
}

class Valore {
	public int val;

    public Valore(int val) { this.val = val; }
}
ho pensato di usare un vettore di appoggio per non modificare il vettore originale.
Nel metodo find_max ad ogni iterazione controllo se flag non è arrivato a 3 e passo l'indice corrente al metodo max_num che calcola il massimo, sempre nell'if una volta trovato il massimo cancello l'elemento trovato (cioè il massimo) del vettore di appoggio. MA QUESTO NON ACCADE PERCHÈ???

grazie..
 
Ciao feys88 e benvenuto nel forum. Dunque nel codice che hai postato non ho capito un granchè comunque la soluzione forse e più semplice di quando pensi. Allora puoi utilizzare un algoritmo di ordinamento che ordina l'array (decrescente) ed estrai i primi tre elementi o gli ultimi tre in base al criterio (crescente o decrescente). In java esiste la classe Arrays che implementa già l'algoritmo di ordinamento, puoi fare in questo modo:
Codice:
int [] array = {5,7,9,10,80,30};
Arrays.sort(array);
int [] valueMax = new int[3];
System.arraycopy(array, array.length-3,valueMax,0,3);
Oppure se vuoi implementare tu un metodo fatto da te ti consiglio di utilizzare il selction sort (decrescente) che alla terzo massimo si ferma:
Codice:
public static int[] selectionSort(int[] array,int n) {
        int [] max = new int[n];
        for (int i = 0; i < n; i++) {
            int massimo = i;
            for (int j = i + 1; j < array.length; j++) {
                if (array[massimo] < array[j]) {
                    massimo = j;
                }
            }
            if (massimo != i) {
                int k = array[massimo];
                array[massimo] = array[i];
                array[i] = k;
                max[i] = k;
            } else max[i] = array[i];
        }
        return max;
    }
Il parametro n, in questo caso e 3, il numero di massimi che vuoi.
Quindi basta che lanci il metodo in questo modo:
Codice:
int [] n = {2,10,8,7,1,12,2};
int [] result = selectionSort(n, 3);
for(int i = 0; i < result.length; i++)
   System.out.println(result[i]);
 
ti ringrazio, finalmente ho capito.
Volevo chiederti se non è troppo, in Java so che i parametri dei metodi vengono passati solo per valore, io che ho sempre programmato in C non riesco capire come il Metodo swap viene implementato in java.

In c faccio cosi:
Codice:
void swap (int *x,int *y){
     int temp=*x;
     *x=*y;
      *y=temp;
}
cioè viene referenziato (passato l'indirizzo)

in java ho provato a fare cosi:
Codice:
void swap (nome_classe [B]x[/B],nome_classe[B] y[/B]){
int temp=nome_classe x;
nome_classe x=nome_classe y;
nome_classe y=temp;
}
ma non funziona ho provato anche usando la versione precedente del codice in C (senza puntatori) ma non funziona,ovvio perchè viene passato per valore.


ancora grazie...
 
In Java i tipi primitivi vengono passati per valore mentre i tipi complessi sempre per riferimento.
Per fare quello che chiedi devi utilizzare la classe Integer al posto del tipo primitivo int.
 
Se non vuoi sbatterti tanto inserisci l'array in un TreeSet<Integer> ed estrai i primi 3 elementi xD
 

Discussioni simili