Newsgroup: it.comp.java
Titolo: Classe Intersezione ed unione insiemi

Secondo voi questa classe è giusta?
Ho provato a richiamarla da un'applicazione ma mi viene dato errore quando
provo a inizializzare un nuovo oggetto IntegerSet e quando provo a fare
l'unione dei due insiemi. La classe comunque mi viene compilata senza
errori.
public class IntegerSet extends Object
{
        private boolean a [] = new boolean [101];
        private int n;
    public IntegerSet() {
        setIntes (a);
    }
    public void setIntes (boolean a[]){
    for (int i = 0; i < a.length; i++)
        a[n] = false;
    }
    public void setInt (boolean a[]){
    for (int i = 0; i < 20; i++)
        n =  1 + (int) (Math.random() *100);
        a[n] = true;
    }
    public void setInu (boolean a[], int h){
     a[h] = true;
    }
    static public IntegerSet unionOfIntegerSets (IntegerSet k1, IntegerSet
k2){
        IntegerSet u = new IntegerSet ();
        for ( int i = 0; i < 101 ; i++){
        if ((k1.a[i] == true) || (k2.a[i] == true))
            u.a[i] = true;
        }
        return u;
    }
    static public IntegerSet intersectionOfIntegerSets (IntegerSet k1,
IntegerSet k2){
        IntegerSet u = new IntegerSet ();
        for ( int i = 0; i < 101 ; i++){
        if ((k1.a[i] == true) && (k2.a[i] == true))
            u.a[i] = true;
        }
        return u;
    }
  static public IntegerSet insertElement (IntegerSet k, int i){
      if (k.a[i] != true)
          k.a[i] = true;
      return k;
    }
  static public IntegerSet deleteElement (IntegerSet k, int i){
      if (k.a[i] != false)
          k.a[i] = false;
      return k;
    }
  public String setPrint (IntegerSet k){
      String output ="";
      for (int i = 0; i < a.length; i++){
      if ( k.a[i] == true)
          output += "  " + i;
      }
      return output;
  }
  public boolean isEqualTo (IntegerSet k1, IntegerSet k2){
      String ou, zo;
      ou = setPrint (k1);
      zo = setPrint (k2);
      if (ou.equals (zo))
          return true;
      else
          return false;
  }
}

     }
Vedi metodo precedente.
A questo punto ti consiglio, prima di passare alla implementazione completa
della classe di stabilire come devi rappresentare gli elementi del vettore.
Poi ti scrivi i due metodi fondamentali che sono insert e delete e li provi
da una classe esterna di test.
Poi poi poi poi poi, se tutto è andato bene passi agli altri metodi più
complessi.
Saluti Vincenzo Stefanazzi.
Inoltre evita di aprire nuovi tread per sottoporre lo stesso quesito.

>     }
Nel costruttore non e' bello chiamare dei metodi della classe (l'ho
fatto anche io ma e' molto rischioso. Devi essere sicuro di quello che
stai facendo) per il semplice fatto che il costruttore si occupa di
portare la classe ad uno stato interno consistente e i metodi assumono
che la classe sia gia' in questo stato consistente perche' ha operato
per primo il costruttore. Ora se tu invochi un metodo dal costruttore
ottieni un controsenso. Ovvero un metodo che crede che il costruttore
abbia gia' fatto il suo lavoro e' invece invocato dal costruttore
stesso. (spero di essere stato chiaro :-|)
Inoltre poi questa chiamata nel tuo caso e' inutile.
L'altra cosa che volevo sottoporre alla tua attenzione e' la
differenza fra primitive e non primitive. Non e' corretto, anche se
efficiente dal punto di vista computazionale, accedere direttamente
alle variabili che compongono lo stato interno di una classe da metodi
non primitivi. Nel tuo caso invece tutti i metodi accedono
direttamente al vettore a.
L'uso di static poi deve di solito essere limitato (se non e' chiaro a
cosa serve e quando non se ne puo' fare a meno) al caso di
realizzazione di librerie di funzioni. Questo perche' Java e'
abbastanza legato al paradigma ad oggetti e se lo usi come linguaggio
funzionale perdi buona parte dei vantaggi che ti offre. (vedi
incapsulamento, ereditarieta', polimorfismo e chi piu' ne ha....)
--
Ciao.
Mario Maroncelli
mar...@mclink.it