Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Problema strano di compilazione

    Ho un codice, che implementa un insieme con una lista linkata, dove devo ordinare gli elementi secondo un SelectionSort in un metodo static factory, ma c'č un metodo che non viene invocato e non capisco perchč.
    Il metodo static factory č:

    codice:
    public static <E extends Comparable>OrderedSet270710<E> SelectionSortBuild(E[] a)
    Ordina l'insieme e lo restituisce, ma nel mio codice non posso utilizzare all'interno del metodo una funzione SelectionSort e non capisco perchč.

    codice:
    public static <E extends Comparable>OrderedSet270710<E> SelectionSortBuild(E[] a)
    	{
    		SelectionSort(a);
    		LinkedList<E> lista2=new LinkedList();
    		for(int i=0; i<a.length; i++)
    		lista2.addNode(new Node(a[i]));
    		return (OrderedSet270710)lista2;
    	}
    	
    	public void swap(E[] a, int i, int j)
    	{
    		E tmp=a[i];
    		a[i]=a[j];
    		a[j]=tmp;
    	}
    	
    	public void SelectionSort(E[] a)
    	{
    		int min;
    		for(int i=0;i<a.length-1; i++)
    		{
    			min=i;
    			
    			for(int j=i+1; j<a.length; j++)
    			{
    				if(a[j].compareTo(a[min])<0)
    					min=j;
    			}
    				swap(a, min, i);
    		}
    	}
    L'errore č:
    codice:
    SS7_003292.java:202: SelectionSort(E[]) in Insieme<E> cannot be applied to (E[])
    		SelectionSort(a);
    Il tipo dovrebbe essere giusto...non capisco come mai non gli vada bene il parametro, dovrebbe essere lo stesso

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Problema strano di compilazione

    Originariamente inviato da Darčios89

    codice:
    public static <E extends Comparable>OrderedSet270710<E> SelectionSortBuild(E[] a)
    	{
    		SelectionSort(a);
    	
    	public void SelectionSort(E[] a)
    SelectionSortBuild č "statico" e il SelectionSort che č "di istanza" lo invochi come se fosse invocato sul "this" .... peccato che il "this" non esiste in un metodo statico.

    E questa č una delle cose super-basilari del linguaggio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    E come faccio ad invocarlo....
    Se non dalla classe stessa....se mi serve ordinare l'array come faccio a chiamarlo...

    Scrivendo questo mi funziona:

    codice:
    public static <E extends Comparable>OrderedSet270710<E> SelectionSortBuild(E[] a)
    	{
    		Insieme<E> obj=new Insieme();
    		obj.SelectionSort(a);
    		Insieme<E> set=new Insieme();
    		for(int i=0; i<a.length; i++)
    		set.insert(a[i]);
    		return set;
    	}
    Perň ho dei dubbi...cioč praticamente il metodo non funzionava perchč essendo statico significa che č di classe, e non si riferisce ad un' istanza, quindi all'interno chiamandolo con l'uso del this non puň funzionare perchč il this si riferisce alle variabili di istanza?

    Perchč perň se dichiaro un nuovo oggetto all'interno funziona?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Darčios89
    E come faccio ad invocarlo....
    Poniti la domanda: SelectionSort che adesso č "di istanza" deve poter accedere a campi di istanza dell'oggetto su cui č invocato? Direi di no, visto che si intuirebbe che opera solo sul parametro E[] a.

    E quindi .... andrebbe "statico".

    Idem "swap".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    A me non funziona....in quel modo mi dŕ sempre problemi, se provo a dichiarare statici anche swap e SelectionSort.....scusami..posto l'intero codice:

    codice:
    import java.util.*;
    import java.io.*;
    interface OrderedSet270710<E extends Comparable> /*extends Iterable<E>*/{
    public int size ();
    // ritorna il numero di elementi dell'insieme
    public void insert (E elem);
    // inseirsce un nuovo elemento nell'insieme
    public E delete(int i);
    // elimina e ritorna l'elemento di posizione i dell'insieme
    public E deleteMin();
    // elimina e ritorna l'elemento piů piccolo dell'insieme
    public boolean contains(E elem);
    // ritorna true se l'elemnto č contenuto nell'insieme
    public Iterator<E> iterator();
    // ritorna un iteratore di tutti gli stack dell'albero
    public E findMax ();
    // ritorna l'elemento piů grande dell'insieme
    }
    
    class Node<E> 
    {
    	private E element;
    	private Node<E> next;
    	
    	public Node(E element)
    	{
    		this.element=element;
    		next=null;
    	}
    	
    	public E getElement(){return element;}
    	public void setNext(Node<E> next){this.next=next;}
    	public Node<E> getNext(){return next;}
    }
    
    class LinkedList<E extends Comparable>
    {
    	private Node<E> head;
    //	private Node<E> tail;
    	private int size;
    	
    	public LinkedList()
    	{
    		head=/*tail*/null;
    		size=0;
    	}
    	
    	public Node<E> getHead(){return head;}
    	//public Node<E> getTail(){return tail;}
    	public int getSize(){return size;}
    	public void setHead(Node<E> head){this.head=head;}
    //	public void setTail(Node<E> tail){this.tail=tail;}
    	
    	public void addNode(Node<E> node)
    	{
    		if(size==0){
    			head=node;
    			//tail=node;
    		}
    		
    		else{
    			Node<E> succ=getHead();
    			Node<E> prec=getHead();
    			boolean inserito=false;
    			
    				while(!inserito && succ!=null)
    				{
    					if(succ.getElement().compareTo(node.getElement())>0)
    					{
    						if(getHead()==succ)
    						{
    							node.setNext(head);
    							head=node;
    							inserito=true;
    						}
    						else{
    							 prec.setNext(node);
    							node.setNext(succ);
    							inserito=true;
    						       }
    					}
    					else
    						prec=succ;
    				    succ=succ.getNext();
    				}
    
    				if(inserito==false){
    					prec.setNext(node);
    					//tail=node;
    				}
    			}
    	   size++;
    	}
    	
    	public Node<E> remove(Node<E> node)
    	{
    		if(size==0) return null;
    		
    		Node<E> current=getHead();
    		Node<E> prec=getHead();
    		
    		while(current!=node)
    		{
    			prec=current;
    			current=current.getNext();
    		}
    		
    		if(current==getHead()){
    			current.setNext(null);
    			head=current.getNext();
    			size--;
    			return current;
    		}
    		
    		else{
    			prec.setNext(current.getNext());
    			current.setNext(null);
    			size--;
    			return current;
    			}
    	}
    }
    
    class Insieme<E extends Comparable> implements OrderedSet270710<E>
    {
    	private LinkedList<E> lista;
    	private int size;
    	
    	private Insieme()
    	{
    		lista=new LinkedList();
    		size=0;
    	}
    	
    	public int size(){return size;}
    	public void insert(E elem)
    	{
    		Node<E> nuovo=new Node(elem);
    		lista.addNode(nuovo);
    	}
    	
    	public E delete(int i)
    	{
    		if(size==0) return null;
    		int j=0;
    		Node<E> tmp=lista.getHead();
    		while(j!=i)
    		{
    			tmp=tmp.getNext();
    			j++;
    		}
    		
    		Node<E> remove=lista.remove(tmp);
    		size--;
    		return remove.getElement();
    	}
    	
    	public E deleteMin()
    	{
    		Node<E> tmp=lista.getHead();
    		lista.remove(tmp);
    		size--;
    		return (E)tmp;
    	}
    	
    	public boolean contains(E elem)
    	{
    		boolean isPresent=false;
    		
    		if(size==0) return isPresent;
    		
    		Node<E> tmp=lista.getHead();
    		
    		while(!isPresent && tmp!=null)
    		{
    			if(tmp.getElement().equals(elem))
    				isPresent=true;
    			tmp=tmp.getNext();
    		}
    		
    	    return isPresent;
    	}
    	
    	public Iterator<E> iterator(){return null;}
    		
    	public E findMax()
    	{
    		if(size==0) return null;
    		Node<E> tmp=lista.getHead();
    		
    		while(tmp.getNext()!=null)
    			tmp=tmp.getNext();
    		
    		return tmp.getElement();
    	}
    	
    	//public static <E extends Comparable> OrderedSet270710<E> QuickSortBuild (E[] a);
    // ritorna un'istanza della classe contenente gli elementi di a
    // utilizza il QuickSort per l'ordinamento
    	
    	public static <E extends Comparable>OrderedSet270710<E> SelectionSortBuild(E[] a)
    	{
    		SelectionSort(a);
    		Insieme<E> set=new Insieme();
    		for(int i=0; i<a.length; i++)
    		set.insert(a[i]);
    		return set;
    	}
    	
    	public static void swap(E[] a, int i, int j)
    	{
    		E tmp=a[i];
    		a[i]=a[j];
    		a[j]=tmp;
    	}
    	
    	public static void SelectionSort(E[] a)
    	{
    		int min;
    		for(int i=0;i<a.length-1; i++)
    		{
    			min=i;
    			
    			for(int j=i+1; j<a.length; j++)
    			{
    				if(a[j].compareTo(a[min])<0)
    					min=j;
    			}
    				swap(a, min, i);
    		}
    	}
    	
    	public String toString()
    	{
    		String s="";
    		int k=0;
    		int stampati=0;
    		Node<E> tmp=lista.getHead();
    		while(stampati!=3)
    		{
    			if(k==3|| k==5 ||k==7)
    			{
    				s+=tmp.getElement()+" ";
    				stampati++;
    			}
    			k++;
    			tmp=tmp.getNext();
    		}
    		
    	return s;
    	}
    	
    }
    
    public class SS7_003292
    {
    	public static void main(String [] args)
    	{
    		programma("input.txt", "output.txt");
    	}
    	
    	public static void programma(String input, String output)
    	{
    		FileReader reader=null;
    		BufferedReader buff=null;
    		PrintWriter out=null;
    		
    		try{
    			reader=new FileReader("input.txt");
    			buff=new BufferedReader(reader);
    			out=new PrintWriter("output");
    			
    			String s=buff.readLine();
    			int elements=0;
    			
    			for(int i=0; i<s.length(); i+=2)
    			elements++;
    		
    			Integer[] a=new Integer[elements];
    			int j=0;
    			
    			for(int i=0; i<s.length(); i++)
    			a[j++]=Integer.parseInt(s.substring(i, i+1));
    			
    			
    			
    			/*int k=0;
    			while(k<5)
    			{
    				collezione.deleteMin();
    				k++;
    			}*/
    		
    		     }
    		     
    		     catch(IOException e1)
    		     {
    			     System.out.println("Error...I/O");
    		     }
    		     
    		     finally{
    				try{
    					reader.close();
    					buff.close();
    					out.close();
    				     }
    				     
    				catch(IOException e2)
    				{
    					System.out.println("Error...it is not possible to close files");
    				}
    			      }
    	}
    }
    Ma ottengo:
    codice:
    SS7_003292.java:210: non-static class E cannot be referenced from a static context
    	public static void swap(E[] a, int i, int j)
    	                        ^
    SS7_003292.java:217: non-static class E cannot be referenced from a static context
    	public static void SelectionSort(E[] a)
    	                                 ^
    SS7_003292.java:212: non-static class E cannot be referenced from a static context
    		E tmp=a[i];
    Cioč significherebbe piů o meno che la classe E non č staica e allora non puň essere usata in un metodo statico. Ma si tratta di un tipo generico, come faccio a rendere statico?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Darčios89
    Cioč significherebbe piů o meno che la classe E non č staica e allora non puň essere usata in un metodo statico. Ma si tratta di un tipo generico, come faccio a rendere statico?
    No, c'č un "piccolo" dettaglio che non ti ho detto prima: un metodo statico non puň usare e "vedere" le type variable dichiarate per la classe. In pratica nei metodi statici di Insieme NON puoi usare la E.

    Se sapessi cosa č la "erasure" (la tecnica con cui sono implementati i generics), avresti una idea del perché c'č questa restrizione.

    Ripensa tutto per bene. Io purtroppo non ho tempo (diciamo nemmeno la voglia ) di leggere per bene tutto il malloppo di codice che hai scritto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Ah....nella mia interfaccia perň il metodo prende come parametro (E[] a), allora si tratta di un errore dell'interfaccia?
    Cambiando e utilizzando ad esempio Integer funziona, allora in questo caso credo che possa modificare l'interfaccia.
    Ora c'č un problema, i metodi static factory consentono di evitare l'uso del costruttore, ma come faccio nel main a inserire gli elementi nell'insieme, se non posso richiamare il costruttore poichč č private?
    Utilizzando il metodo static factory a chi devo farlo invocare per ottenre un' istanza della classe?

    Per esempio se ho questo main:

    codice:
    public class SS7_003292
    {
    	public static void main(String [] args)
    	{
    		programma("input.txt", "output.txt");
    	}
    	
    	public static void programma(String input, String output)
    	{
    		FileReader reader=null;
    		BufferedReader buff=null;
    		PrintWriter out=null;
    		
    		try{
    			reader=new FileReader("input.txt");
    			buff=new BufferedReader(reader);
    			out=new PrintWriter("output");
    			
    			String s=buff.readLine();
    			int elements=0;
    			
    			for(int i=0; i<s.length(); i+=2)
    			elements++;
    		
    			Integer[] a=new Integer[elements];
    			int j=0;
    			
    			for(int i=0; i<s.length(); i++)
    			a[j++]=Integer.parseInt(s.substring(i, i+1));
    			
    			Insieme collezione=SelectionSortBuild; // non va
    			int k=0;
    			while(k<5)
    			{
    				collezione.deleteMin();
    				k++;
    			}
    		
    		     }
    		     
    		     catch(IOException e1)
    		     {
    			     System.out.println("Error...I/O");
    		     }
    		     
    		     finally{
    				try{
    					reader.close();
    					buff.close();
    					out.close();
    				     }
    				     
    				catch(IOException e2)
    				{
    					System.out.println("Error...it is not possible to close files");
    				}
    			      }
    	}
    }
    Non posso invocare il metodo perchč nella classe del main non lo trova ovviamente, ma come faccio allora ad invocare il metodo?

  8. #8
    Non č che saresti cosě gentile da spiegarmi come invocare il metodo dal main?
    Purtroppo su questa parte non sono molto ferrato...e nel libro non sono trattati i metodi static factory...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.