Arraylists compareTo och åtkomstmetoder i java

Permalänk

Arraylists compareTo och åtkomstmetoder i java

Hej!
Sitter och pysslar lite med java och försöker skapa en sorterad arraylist , har använt mig av comparable och skrivit en egen compareTo metod , men om man nu skulle vilja sortera listan beroende på flera variabelvärden dvs kanske inte bara genom att jämföra strängar utan även nummer så att listan skrivs ut i nummer och bokstavordning , vad ska man tänka på när man skriver compareTo metoden isåfall?
Om jag skulle lägga arraylisten i en annan klass än själva main programmet hur bör åtkomstmetoden vara utformad för att man ska kunna lägga till objekten på rätt sätt , ponera att jag både vill kunna lägga till textsträngar och intar
all hjälp uppskattas
mvh
/toxicwaste

Permalänk
Medlem
Skrivet av toxicwaste2014:

Hej!
Sitter och pysslar lite med java och försöker skapa en sorterad arraylist , har använt mig av comparable och skrivit en egen compareTo metod , men om man nu skulle vilja sortera listan beroende på flera variabelvärden dvs kanske inte bara genom att jämföra strängar utan även nummer så att listan skrivs ut i nummer och bokstavordning , vad ska man tänka på när man skriver compareTo metoden isåfall?

Tänk på att göra så lite som möjligt i compareTo, då den metoden potentiellt körs väldigt många gånger beroende på hur mycket data som ska sorteras.

Börja med att jämföra värdet som först ska sorteras på. Ex. efternamn och sedan förnamn om du vill ha en lista med "efternamn, förnamn".
Skickades från m.sweclockers.com

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk

Okej jag har försökt att jämföra flera värden i compareTo med hjälp av && operatorn men verkar inte kompilera då , kan man kanske använda sig av en switchsats eller if/else sats i metoden för att på något sätt kunna jämföra flera saker med varandra eller tänker jag fel här nu?
mvh
toxicwaste

Permalänk
Medlem

Börja med att jämföra fösta värdet, är dessa olika returneras det. Är de lika jämförs andra värdet, osv.

Har du lite kod att visa är det lättare att se vad som är fel.

Skickades från m.sweclockers.com

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk

import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; public class IndexDriver { public static void main(String args[]){ Index index = new Index(); index.add("Delta", 1); index.add("Foxtrot", 3); index.add("Tango", 9); index.add("Charlie", 5); index.add("Foxtrot", 8); index.add("Delta", 51); index.add("Echo", 1); System.out.println(index); // klass 2 import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; public class Index implements Comparable<Index> { private String namn; private Integer sida; private ArrayList<Index> lista=new ArrayList<Index>(); public Index(){ this.sida=sida; this.namn=namn; } public String getNamn(){ return namn; } public Integer getSida(){ return sida; } public void add(String string, int i) { } public int compareTo(Index o) { sida.compareTo(o.sida); return namn.compareTo(o.namn); } public String toString(){ HashSet hashSet = new HashSet(lista); //Skapa en hashset av första listan ArrayList lista2 = new ArrayList(lista) ; //ordna lista Collections.sort(lista2); return namn+" "+sida; } }

Försöka alltså lägga till objekt till en arraylist och sortera dem i sifferordning och namnordning och eliminera dubbletter med hjälp utav hashset men vid utskrift returneras bara nullvärden , varför blir det så? :confused

Permalänk
Medlem

Du måste överlagra hascode i din Index klass.

Permalänk

Ganska säker på att du kan sortera listan med olika comperator. Gjorde själv det rätt nyligen.

Edit:

Men om du vill sortera efter först en sak, sen om de är lika så ska du sortera efter en annan så kan du göra såhär.
public int

compareTo(Object in) {

if (point.getX() > getX()) {
return -1;
} else if (point.getX() < getX()) {
return 1;
} else {

if (point.getY() > getY()) {
return -1;
} else if (point.getY() < getY()) {
return 1;
} else {
return 0;
}
}
}

Sorterar här först efter x, sen efter y.

Permalänk

public int compareTo(Index1 in) { if (in.name.compareTo(in.name)>0) { } else { if (in.page.compareTo(in.page)>0) { } return name.compareTo(in.name); } return page.compareTo(in.page); }

HashSet hashSet = new HashSet(index); ArrayList index2 = new ArrayList(index) ; Collections.sort(index); for(Object i: index2) System.out.println(i);

verkar inte ta bort dubbletter i listan , vad kan ha gått fel? jag har ju skapat en hashset av min första arraylist och loopar ju igenom den vid utskrift men dubbletterna kvarsår , skumt

Permalänk
Medlem
Skrivet av toxicwaste2014:

public int compareTo(Index1 in) { if (in.name.compareTo(in.name)>0) { } else { if (in.page.compareTo(in.page)>0) { } return name.compareTo(in.name); } return page.compareTo(in.page); }

HashSet hashSet = new HashSet(index); ArrayList index2 = new ArrayList(index) ; Collections.sort(index); for(Object i: index2) System.out.println(i);

verkar inte ta bort dubbletter i listan , vad kan ha gått fel? jag har ju skapat en hashset av min första arraylist och loopar ju igenom den vid utskrift men dubbletterna kvarsår , skumt

Du tar inte bort dubletter genom att sortera något. Dessutom sorterar du index och skriver ut innehållet i index2.

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Japp jo det är sant men jag gör ju också en hashset av första listan vilket jag tolkar som att den resulterande listan index2 inte kan innehålla duplicates?

Permalänk
Hedersmedlem
Skrivet av toxicwaste2014:

Japp jo det är sant men jag gör ju också en hashset av första listan vilket jag tolkar som att den resulterande listan index2 inte kan innehålla duplicates?

Det hashset du skapar blir ju variabeln hashset. Du har inte gjort något alls med index, därför finns fortfarande dubletter i index2.

Permalänk

Visst är det så att compareTo endast sorterar listan efter ett värde i taget , dvs oavsett om man kör med if sats eller ej så kan man bara sortera efter "ett värde i taget"?

public int compareTo(Index1 in) { int result = this.name.compareToIgnoreCase(in.name); if(result != 0){ return result; }else{ } return page.compareTo(in.page); }

sorterar ju bara index1 objekten efter värdet på name osv...?

Permalänk
Medlem
Skrivet av toxicwaste2014:

Visst är det så att compareTo endast sorterar listan efter ett värde i taget , dvs oavsett om man kör med if sats eller ej så kan man bara sortera efter "ett värde i taget"?

public int compareTo(Index1 in) { int result = this.name.compareToIgnoreCase(in.name); if(result != 0){ return result; }else{ } return page.compareTo(in.page); }

sorterar ju bara index1 objekten efter värdet på name osv...?

Den sorterar först efter name och sedan efter page. Detta sker samtidigt: om name är avgörande finns det ingen anledning att sortera efter page, det är bara när två Index1 (jäkligt konstigt klassnamn förövrigt) har samma name som page behöver jämföras.

Du kan ta bort else-satsen eftersom den ändå inte gör någonting, alternativt flytta in sista return-satset i den. Tänk på hur din kod ser ut; om den ser konstig ut är den förmodligen konstig.

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Ok jag kanske krånglat till det lite men jag vill ju sortera Index1 objekten efter både namn och sida ,
Index1 är tänkt att innehålla en arraylist med en samling av böcker med titel och antalet sidor..
är använding av compareTo fel väg att gå i det här fallet? eller kan man göra på nåt bättre sätt?

Permalänk
Medlem
Skrivet av toxicwaste2014:

Ok jag kanske krånglat till det lite men jag vill ju sortera Index1 objekten efter både namn och sida ,
Index1 är tänkt att innehålla en arraylist med en samling av böcker med titel och antalet sidor..
är använding av compareTo fel väg att gå i det här fallet? eller kan man göra på nåt bättre sätt?

Det är det din compareTo gör: den sorterar i första hand efter name och sedan efter page.

Om Index1 är likadan som din Index du visar ovan så är den egentligen väldigt konstigt uppbygd. Den bör definitivt inte hålla en lista av sig själv.

Visa signatur

Kom-pa-TI-bilitet