objekte in hashset einsortieren

Status
Nicht offen für weitere Antworten.

djterm

Mitglied
hallo!

ich bin neu hier, deshalb weiß ich nicht, ob die frage wirklich als anfängerfrage geeignet ist.

also: ich habe eine liste, genauer ein hashset. in dieses hashset sind objekte abgelegt, wie immer beim set ohne reihenfolge.
nun will ich aber durch überschreiben der compareTo() - methode erreichen, dass die objekte sehr wohl sortiert werden, z.b. für objekte autos nach ps-zahl.

problem ist, dass die überschriebene methode überhaupt nicht aufgerufen wird.

die eigentliche frage lautet also:

wie kann man objekte in einer sortierten reihenfolge in ein hashset ablegen?

-------------------------------------------------------------------------------------------------------------------------------------------

oppinions are like assholes:
everyone has one!!!
 
was brächte das für einen Vorteil, die Objekte dort sortiert abzulegen?
ein Hashset macht sowas gar nicht,
ein TreeSet vielleicht?


opinion mit einem p?
 
danke für die antwort, aber:

ein hashset sortiert sehr wohl in einer gewissen reihenfolge. diese bleibt natürlich verborgen, ist aber vorhanden, lexikalisch oder ähnlich.

beim treeset würde es ja auf die gleiche problematik hinauslaufen:

irgendwo muss man dem treeset ja sagen, nach welchen kriterien er sortieren soll. also muss eine methode überschrieben werden. wahrscheinlich compare oder compareTo...

dies tat ich bereits, es hat jedoch keine wirkung gezeigt...genau das ist mein problem
 
tja, das ist dann eine andere Frage,
dazu müsste man deinen Code sehen,

was man alles so braucht kann ich nicht genau sagen,
auf der sicheren Seite bist du aber mit allen 4 Punkten:
implements Comparable, compareTo, equals und hashCode

siehe folgendes Beispiel:
Code:
package test;

import java.util.HashSet;
import java.util.TreeSet;

public class Test implements Comparable {
    int i;

    public Test(int i) {
        this.i = i;
    }

    public static void main(String[] args) throws Exception {
        p("Start");

        int[] ints = new int[] { 4, 7, 2, 5, 7, 3, 4, 7, 6, 6 };

        HashSet<Test> set = new HashSet<Test>();

        for (int i : ints) {
            Test t = new Test(i);
            set.add(t);
        }

        p("\nset: " + set);
        for (Test t : set) {
            p("t: " + t);
        }

        TreeSet<Test> set2 = new TreeSet<Test>();
        for (int i : ints) {
            Test t = new Test(i);
            set2.add(t);
        }

        p("\nset2: " + set2);
        for (Test t : set2) {
            p("t: " + t);
        }

        p("End");

    }

    public static void p(Object o) {
        System.out.println(( o == null ? o : o.toString() ));
    }

    public int compareTo(Object other) {
        return i - ( (Test) other ).i;
    }

    public boolean equals(Object other) {
        return this.hashCode() == other.hashCode();
    }

    public int hashCode() {
        return i;
    }

    public String toString() {
        return String.valueOf(i);
    }
}

bei mir ist es da aber so wie ich vermutete:
für ein HashSet wird nix sortiert,
bei einem TreeSet werden die Objekte im Iterator in der richtigen Reihenfolge ausgegeben:

Start

set: [2, 4, 6, 3, 7, 5]
t: 2
t: 4
t: 6
t: 3
t: 7
t: 5

set2: [2, 3, 4, 5, 6, 7]
t: 2
t: 3
t: 4
t: 5
t: 6
t: 7
End
 
ok dann schick ich mal den code. nicht wundern, dass das beispiel so einfach gehalten ist, es soll ne übung sein!

Code:
hier das main:

import java.util.HashSet;
import java.util.Iterator;

public class Main {

public static void main(String[] args) {

		PKW bmw = new PKW();
		bmw.setName("3er BMW");
		bmw.setColor("Rot");
		bmw.setHorsePower(150);
		bmw.setCabrio(true);
		
		Bus bully = new Bus();
		bully.setName("VW Bully");
		bully.setColor("Gelb");
		bully.setHorsePower(100);
		bully.setBaujahr(1978);
		bully.setKlima(true);

HashSet<Auto> setlist = new HashSet<Auto>();
		
		setlist.add(bmw);
		setlist.add(bully);
		setlist.add(stinger);
		setlist.add(buffalo);
		setlist.add(mercedes);
		
		for (Iterator it = setlist.iterator();it.hasNext();){
			
			Object ob = it.next();
			Auto tmp = (Auto) ob;
			
			System.out.println("\nTyp : "+tmp.getClass().getSimpleName()+"\nName: "+tmp.getName()+
							   "\nPS  : "+tmp.getHorsePower());
		}
	}

}




Klasse PKW:
public class PKW extends Auto{
	
	private boolean cabrio, klima;
	
	public boolean isCabrio(){
		
		return cabrio;
	}
	
	public void setCabrio(boolean cabrio){
		this.cabrio = cabrio;
		
	}
	
	public void setKlima(boolean klima){
		this.klima = true;
	}
	
	public boolean isKlima(){
		return klima;
	}


}


Klasse Bus:

public class Bus extends Auto{
	
	private int baujahr;
	private boolean klima;
	
	public void setBaujahr(int baujahr) {
		this.baujahr = baujahr;
	}
	
	public int getBaujahr() {
		return baujahr;
	}
	
	public void setKlima(boolean klima){
		this.klima = true;
	}
	
	public boolean isKlima(){
		return klima;
	}

}


Klasse Auto:

public class Auto implements Comparable{
	
	private String color;
	private String name;
	private int maxSpeed;
	private double horsePower;
	
	public void setName(String name){
		this.name=name;
	}
	
	public String getName(){
		return name;
	}
	
	public void setColor(String color){
		this.color = color;
	}
	
	public String getColor(){
		return color;
	}
	
	public void setMaxSpeed (int maxSpeed) {
		
		this.maxSpeed = maxSpeed;
	}
	
	public int getMaxSpeed () {
		return maxSpeed;
	}
	
	public void setHorsePower(double horsePower){
		this.horsePower = horsePower;
	}
	
	public double getHorsePower(){
		return horsePower;
	}

	public int compareTo(Object o) {
		
		Auto tmp=(Auto)o;
		
		if ( tmp.getHorsePower() < this.getHorsePower() ) {
	
			return -1;
		}
		if ( tmp.getHorsePower() == this.getHorsePower() ) {
		
			return 0;
		}
		
		if ( tmp.getHorsePower() > this.getHorsePower() ) {
		
			return 1;
		}
		return 0;
	}
}
 
und wie wirkt sich diese Sortierung dann aus?
bei meinem Beispiel ist die HashCode-Sortierung ja die gleiche wie compare,
dennoch wird beim Iterator anscheinend nur die Einfüge-Reihenfolge genommen
 
ich habs jetzt so gemacht:
in Auto.java:
Code:
	public int compareTo(Object o) {		
		Auto tmp=(Auto)o;		
		if ( tmp.getHorsePower() < this.getHorsePower() ) {	
			return -1;
		}
		if ( tmp.getHorsePower() == this.getHorsePower() ) {		
			return 0;
		}		
		if ( tmp.getHorsePower() > this.getHorsePower() ) {		
			return 1;
		}
		return 0;
	}
in Main.java:
		TreeSet<Auto> setlist = new TreeSet<Auto>();
		
		setlist.add(bmw);
		setlist.add(bully);
		setlist.add(stinger);
		setlist.add(buffalo);
		setlist.add(mercedes);
		
		for (Iterator it = setlist.iterator();it.hasNext();){
			Object ob = it.next();
			Auto tmp = (Auto) ob;
			System.out.println("\nTyp : "+tmp.getClass().getSimpleName()+"\nName: "+tmp.getName()+
							   "\nPS  : "+tmp.getHorsePower());
		}
somit erfolgt die ausgabe nach ps sortiert (größte zuerst).
 
Pardon, ich habe mich nicht ganz korrekt ausgedrückt. Bei HashSet wird der Hashcode des Objekts verwendet, um zu prüfen, ob das Objekt schon Element der Menge ist. Die Iterationsreihenfolge bei HashSets ist quasi beliebig.

HashSet hat gesagt.:
This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben