Avatar billede gg Praktikant
22. februar 2011 - 00:03 Der er 6 kommentarer og
1 løsning

Hjælp til Comparable

Hejsa jeg har følgende kode(udsnit):

public class A {
private Map nodeIds;

public A() {
  nodeIds = new TreeMap();
}


public void insertNode(OrgNode n) {
  nodeIds.put(n.nodeid, n);
}

public class OrgNode implements Comparable<OrgNode>{
public String nodeId;
public String txt;
public static boolean SORT_ASC = true;

public OrgNode(String nodeId, Strinng txt) {
this.nodeId = nodeId;
this.txt = txt; 
}
public int compareTo(OrgNode o) {
  int result = txt.compareTo(o.txt);
  if(result == 0) {
    return 0;
  }
  if(SORT_ASC) {
    return (result > 0) ? 1: -1;
  } else {
    return (result < 0) ? 1: -1;
  }
  }
}

Klassen A kaldes fra klassen B, med OrgNode som parametre. Men som det er nu bliver min TreeMap sorteret ud fra nodeId key, så hvis jeg har 3 OrgMap objekter

Public class B {
  public create() {
    A obj = new A();
      OrgNode o1 = new OrgNode(2,"aabb");
      OrgNode o2 = new OrgNode(1,"test");
      OrgNode o3 = new OrgNode(3,"Viiii");
      obj.insertNode(o1);
      obj.insertNode(o2);
      obj.insertNode(o3);
    }
}
vil mit treeMap bliver sorteret ud fra nøglen(nodeId)
Så rækkefølgen vil være;
OrgNode o2 = new OrgNode(1,"test");
OrgNode o1 = new OrgNode(2,"aabb");
OrgNode o3 = new OrgNode(3,"Viiii");

MEN jeg vil rent faktisk gerne have rækkefølgen der følger txt dvs jeg vil gerne have følgende rækkeføle:

OrgNode o1 = new OrgNode(2,"aabb");
OrgNode o2 = new OrgNode(1,"test");
OrgNode o3 = new OrgNode(3,"Viiii");

Hvad er det lige jeg gør forkert ?
Avatar billede arne_v Ekspert
22. februar 2011 - 00:12 #1
En TreeMap organiserer jo efter key ikke efter value.

En mulighed var at droppe keys og kun gemme nodes i et TreeSet.
Avatar billede arne_v Ekspert
22. februar 2011 - 00:12 #2
En anden mulighed var at gemme nodes i 2 strukturer en som sorterer efter id og en som sorterer efter txt.
Avatar billede gg Praktikant
22. februar 2011 - 01:19 #3
Der er super Arne>> Løsningen at have 2 strukturer. Tak for hjælpen :-)
Avatar billede arne_v Ekspert
22. februar 2011 - 01:27 #4
svar
Avatar billede arne_v Ekspert
22. februar 2011 - 01:28 #5
Fordi man jo kun gemmer referancer i diverse collections er det tit en OK ide at gemme i mere end en collection, hvis man har forskellige behov.
Avatar billede gg Praktikant
22. februar 2011 - 10:36 #6
Arne_v>> Referencer dvs. at de fysiske data ligger et andet sted ? Så collectionen/ referencen er vel egentlig et opslagsværk til at finde de fysiske data ? Tja det er jo egentlig også sådan databaser fungerer,her tænker jeg på f.eks. B+Tree. Mig bekendt er et Tree Map også implementeret som et reb-black tree.

I forhold til at bruge implements Comparable på en klasse for at lave en sin egen sortering er det rigtigt forstået at når klasse såsom ProductLine implementerer Comparable

public class ProductLine implements Comparable<ProductLine>{
private String description;
public static boolean SORT_ASC = true;

public int compareTo(ProductLine p) {
        int result = description.compareTo(p.description);
        if(result == 0) {
            return 0;
        }
        if(SORT_ASC) {
            return (result > 0) ? 1: -1;
        } else {
            return (result < 0) ? 1: -1;
           
        }
    }
}

og man så kalder
List<ProductLine> result = new ArrayList<ProductLine>();
Collections.sort(result);

så vil ens ArrayList blive sorteret ud fra det man har defineret i compareTo metoden ?
Avatar billede arne_v Ekspert
22. februar 2011 - 15:01 #7
2 x ja
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester