Vinnaren i pepparkakshustävlingen!
2008-01-28, 19:03
  #1
Medlem
Eaglecoths avatar
Jag har en generisk klass som läser in element från en fil, jag vill placera dessa element i en array, men då måste jag definera vilken typ arrayen ska ha, hur löser man detta? ska man skapa en array av object, eller finns det något annat bra sätt?


mvh

Eaglecoth
Citera
2008-01-28, 19:07
  #2
Medlem
Eaglecoths avatar
Tillägg

Elementen i filen är homogena, så finns det någon bra metod för att identifiera typen av element, och sedan låta arrayen bli av den typen?
(jag läser in allt med en bufferedreader så det går ju snabbt att identifiera vad som finns i filen och således låta arrayen initieras med den typen)

/eaglecoth
Citera
2008-01-28, 19:13
  #3
Medlem
kineticss avatar
Citat:
Ursprungligen postat av Eaglecoth
Elementen i filen är homogena, så finns det någon bra metod för att identifiera typen av element, och sedan låta arrayen bli av den typen?
(jag läser in allt med en bufferedreader så det går ju snabbt att identifiera vad som finns i filen och således låta arrayen initieras med den typen)

/eaglecoth
Är elementens klasser definierade av dig själv? Isåfall skulle jag köra med arv. T.ex. ett interface Element och ett antal klasser som implementerar Element, ÄppleElement implements Element och PäronElement implements Element. Din array är av typen Element.
Citera
2008-01-28, 19:24
  #4
Medlem
Eaglecoths avatar
Arv å annat

Kan vara en ide, jag är ganska ny på java, jag har alltså ett interface, myset<E> med en metod som tar ett <E> och kontrollerar om det finns i datastrukturen. jag beskriver med kod:

public interface myset<E>{

public bool member(element E){}
}

målet här är alltså att skapa en klass som implementerar interface:et och tar en comparator som argument till konstruktorn. Så att metoden member använder comparatorn när den letar efter ett visst element
Citera
2008-01-28, 19:31
  #5
Medlem
Eaglecoths avatar
Objektorienterad struktur

Jag är lite osäker på hur man ska göra detta för att det ska bli "objektorienterat"

givet följande:

1.en fil med element av endast en generisk typ
2.ett objekt som ska ha elementen från filen sparade i en array
3. en komparator som ges som argument till konstruktorn när objektet skapas
3. på objektet i 2 ska man kunna köra metoden member(E element) och få true om komparatorn givet i konstruktorn utvärderar e till att vara lika med något element i listan

Jag vet inte riktigt var jag ska placera inläsninging av data osv, tacksam för tips
Citera
2008-01-28, 21:04
  #6
Medlem
kineticss avatar
Tror jag missuppfattade dig lite. Du ska alltså skapa en generisk klass typ:
Kod:
class ElementReader<T>{
     T[] elements;

     public bool member(T inelement){
          for(T e : elements){
               if(e.equals(inelement))
                    return true;
          }
          return false;
     }
     ....
}
Kan det vara en början?
Citera
2008-01-29, 11:13
  #7
Medlem
Eaglecoths avatar
Kodförslag

Ja det verkar som en bra start, i specen behöver jag två konstruktorer, en som använder den naturliga ordningen, och en konstruktor till vilken man skickar med en komparator som argument, sök-metoden ska då använda den komparator man angivit, och skapar man objektet utan argument ska naturliga ordningen gälla, det lättaste är vär isf att själv definera en komparator som använder den naturliga ordningen, ifall man inte skickar med någon till konstruktorn, eller finns det kanske redan en fördefinerad sådan komparator?

/Eaglecoth
Citera
2008-01-29, 21:34
  #8
Medlem
kineticss avatar
Citat:
Ursprungligen postat av Eaglecoth
Ja det verkar som en bra start, i specen behöver jag två konstruktorer, en som använder den naturliga ordningen, och en konstruktor till vilken man skickar med en komparator som argument, sök-metoden ska då använda den komparator man angivit, och skapar man objektet utan argument ska naturliga ordningen gälla, det lättaste är vär isf att själv definera en komparator som använder den naturliga ordningen, ifall man inte skickar med någon till konstruktorn, eller finns det kanske redan en fördefinerad sådan komparator?

/Eaglecoth

Ur java API:
public interface Comparable

This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method.


Så om du vill ha den naturliga ordningen använder du equals som definieras i interfacet Comparable:

Kod:
class ElementReader<T implements Comparable>{
     T[] elements;
     Comparator comparator;

     public ElementReader(Comparator comparator){
          this.comparator=comparator;
     }

     public bool member(T inelement){
          if(comparator==null){
               //Use natural ordering
               for(T e : elements){
                    if(e.equals(inelement))
                         return true;
               }
          } else{
               //Use defined comparator
               ...
          } 
          return false;
     }
     ....
}

Du använder väl API dokumentationen?
http://java.sun.com/j2se/1.4.2/docs/api
Citera
2008-01-29, 22:14
  #9
Medlem
Citat:
Ursprungligen postat av kinetics
Du använder väl API dokumentationen?
http://java.sun.com/j2se/1.4.2/docs/api
Fast ska man leka med generics vill man nog ha
http://java.sun.com/j2se/1.5.0/docs/api/
eller varför inte lika gärna det senaste:
http://java.sun.com/javase/6/docs/api/
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback