"Universelle" Datenstruktur anlegen

chris_head

Mitglied
Hallo,

ich hab folgendes Problem:
ich benötige eine Objekt, dass einen Double-Wert und wahlweise ein boolean[], ein char[] oder eine ArrayList beinhalten soll.
Dieses Objekt soll die entsprechenden Getter und Setter beeinhalten.
Die Datenstruktur sollte so "schmal" wie möglich gehalten werden.

Bisher habe ich java.lang.Object verwendet. Und mir den Typ dann immer gecastet.
Dies möchte ich wenns irgendwie geht vermeiden.

Hat jemand einen alternativen Ansatz (am besten ohne Object zu benutzen)?
 
Was hälst Du davon eine Objekt zu schaffen, das 4 Attribute(double, boolean[], char[], ArrayList) besitzt und schreibe dann 4 Getter und Setter . Oder erkläre mal bitte, was Du eigentlich mit diesem Design erreichen willst.
 
Die Struktur soll je ein Individuum für evolutionäre Algorithmen (EA) repräsentieren. Der Double-Wert soll die Fitness des Induviuums spiechern und das Array bzw. ne ArrayList oä. soll den "Genotyp" des Individuums bilden. Der Genotyp kann je nach Problemstellung des EA unterschiedlich aussehen. Für ein Binäres Problem bietet sich boolean[] an. Für ein Problem bei dem der Genotyp eine Zeichenkette darstellt wäre char[] passend, für Probleme mit Tupeln aus Integer-Werten könnte der Genotyp als ArrayList<Integer> gewählt werden.

Eine Unterscheidung welcher Genotyp genutzt wird bzw. welche Form der Genotyp haben soll, wird über eine Enumeration geschaltet und kann abgefragt werden.

So das sollte erstmal reichen. Die Idee mit einem Objekt, das alle verschiedenen Arrays bzw. Listen beinhaltet, könnte ich benutzen. Aber vll geht das noch etwas "schöner".
 
Kann davon ausgegangen werden, dass diese verschiedenen Typen nicht innerhalb der gleichen Problemstellung auftauchen werden und das Programm in Java 5.0 oder hoeher implementiert wird?

Dann sind Generics deine Freunde.
 
Kann davon ausgegangen werden, dass diese verschiedenen Typen nicht innerhalb der gleichen Problemstellung auftauchen werden und das Programm in Java 5.0 oder hoeher implementiert wird?

davon kann man ausgehen. Allerdings sind Generics meiner Meinung nach nicht die richtige Wahl (ich lass mich aber gern durch ein kleines Beispiel überzeugen).
 
Zuletzt bearbeitet:
Hallo,

warum sollen Generics nicht die richtige Wahl sein?

Gut, was nicht so leicht zu lösen ist, da es da keine Ähnlichkeit gibt, ist das mit der ArrayList, da es ja nicht direkt ein Array ist. Warum nutzt du nicht eigentlich nur eine ArrayList?

MFG

zEriX
 
Gut, was nicht so leicht zu lösen ist, da es da keine Ähnlichkeit gibt, ist das mit der ArrayList, da es ja nicht direkt ein Array ist. Warum nutzt du nicht eigentlich nur eine ArrayList?

Meinst du nur Arraylist und einen DoubleWert?


zu Generics:
das Problem ist wenn ich Generics nutze, dass ich INNERHALB der Klasse welche generisch ist kein Objekt des Generic ERZEUGEN kann.

Ich hab jetzt mal mit etwas Hilfe eine mögliche Lösung:

Code:
public abstract class Individual{
	double fitness = 0.0;

	public double getFitness() {
		return fitness;
	}

	public void setFitness(double fitness) {
		this.fitness = fitness;
	}
}

Code:
public class BoolIndividual extends Individual {
	boolean[] genotype = null;

	public BoolIndividual(boolean[] genotype) {
		this.genotype = genotype;
	}

	public BoolIndividual(boolean[] genotype, double fitness) {
		this.genotype = genotype;
		this.fitness = fitness;
	}

	public boolean[] getGenotype() {
		return genotype;
	}

	public void setGenotype(boolean[] genotype) {
		this.genotype = genotype;
	}
}

Code:
public class CharIndividual extends Individual {
	char[] genotype = null;

	public CharIndividual(char[] genotype) {
		this.genotype = genotype;
	}

	public CharIndividual(char[] genotype, double fitness) {
		this.genotype = genotype;
		this.fitness = fitness;
	}

	public char[] getGenotype() {
		return genotype;
	}

	public void setGenotype(char[] genotype) {
		this.genotype = genotype;
	}
}

Was haltet Ihr davon? (so richtig toll find ichs immer noch nicht)
 
Du kannst schon eine neue Instance davon erzeugen, indem du im Contructor einfach ein Class-Object mit übergibst.

So ist es auch eine Lösung. Ich würde diese so auch bevorzugen.

Warum benutzt du nicht einfach eine ArrayList, statt den Arrays? So bist du flexible was du speicherst und könntest das alles auch mit Generics lösen.

MFG

zEriX
 
Der Hauptgrund warum ich Arrays nutze ist, dass ich möglichst wenig Speicher verwenden will, da dieses Objekt sehr oft genutzt werden soll.

Kannst du meinen Code bitte mal so anpassen, dass er "Generictauglich" wird?
 
Ist das ungefähr so wie du es dir vorstellst?

Java:
private class Foo<T>{
		private double fitness = 0.0;
		private List<T> list = new ArrayList<T>();
		private Class<T> clazz = null;
		
		public Foo(Class<T> c) {
			clazz = c;
		}

		public double getFitness() {
			return fitness;
		}

		public void setFitness(double fitness) {
			this.fitness = fitness;
		}
		
		public List<T> getList(){
			return list;
		}
		
		public void addElement(T o){
			list.add(o);
		}
		
		public void setList(List<T> list){
			this.list = list;
		}
		
		public void removeElement(T o){
			list.remove(o);
		}
		
		public void createNewElement(){
			try {
				list.add(clazz.newInstance());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

MFG

zEriX
 

Neue Beiträge

Zurück