Seřazení ArrayListu abecedně – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Seřazení ArrayListu abecedně – Java – Fórum – Programujte.comSeřazení ArrayListu abecedně – Java – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
pompo
~ Anonymní uživatel
4 příspěvky
11. 11. 2012   #1
-
0
-

Ahoj, potřeboval bych poradit. Když mám vytvořený ArrayList ve kterém mám uložené např. firmy a chtěl bych si je potom vypisovat abecedně od a do z. Tuším, že bych měl použít java.util.comparator, ale prozatím se přes to nemůžu přelouskat.. dík za pomoc

Nahlásit jako SPAM
IP: 90.177.193.–
Reklama
Reklama
TheOndrap+2
Super člen
11. 11. 2012   #2
-
0
-

Pokud se nemejlím, měl bys přepsat metodu  int compateTo(Object o) u toho vkládaného objektu

tak, aby ti vracela -1,0 nebo 1 podle toho jak mají být ty dva prvky řazeny (0 = jsou stejné).

Potom můžeš využívat hledací a řadící funkce kolekcí. OK?

Nahlásit jako SPAM
IP: 88.102.250.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
pompo
~ Anonymní uživatel
4 příspěvky
11. 11. 2012   #3
-
0
-

No jo, ale tohle já neumím. S javou teprve začínám, takže nemám moc ponětí.. 

Nahlásit jako SPAM
IP: 90.177.193.–
pompo
~ Anonymní uživatel
4 příspěvky
11. 11. 2012   #4
-
0
-

class PorovnavaniZakladateluDleAbecedy <Firma> {
public int compare (Firma prvni, Firma druha){
  String zakladatelPrvni = prvni.getZakladatel();
  String zakladatelDruhy = druhy.getZakladatel();
  return zakladatelPrvni.compareTo(zakladatelDruhy);
}
}

tohle jsem vytvořil. vím přesně co chci, aby to dělalo akorát nevim co a jak dál..

Nahlásit jako SPAM
IP: 90.177.193.–
TheOndrap+2
Super člen
11. 11. 2012   #5
-
0
-

ukaž jak vypadá tvoje třída Firma

Nahlásit jako SPAM
IP: 88.102.250.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
pompo
~ Anonymní uživatel
4 příspěvky
11. 11. 2012   #6
-
0
-

public class Firma
{
    private String nazev;
    private int cislo;     


public Firma(String nazev, int cislo) {
        this.nazev = nazev;
        this.cislo = cislo;
    }

public String getNazev() {
        return nazev;
    }
   

public int getCislo() {
        return cislo;
    }
   
    @Override
    public boolean equals(Object o) {
        if (o instanceof Firma) {
            Firma druha = (Firma) o;
            return nazev.equals(druha.nazev);
        }
        return false;
    }
   
    @Override
    public int hashCode() {
        return 0;
    }
}

Nahlásit jako SPAM
IP: 90.177.193.–
TheOndrap+2
Super člen
11. 11. 2012   #7
-
0
-

no, a stejně jak si udělal hashCode(), equals(Object o) tak udělej metodu int compareTo(Object o) tak, aby vracela :

-1 když o je větší než obj (třeba "z">"a")

+1 když o je menší než obj ("a"<"z")

0 když jsou stejný ("a"=="a")

Nahlásit jako SPAM
IP: 88.102.250.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Dano
~ Anonymní uživatel
100 příspěvků
12. 11. 2012   #8
-
0
-

Doplnenie TheOndrapoveho tvrdenia. Ked chces vyuzit metodku  

int compareTo(Object o); 

Musis pre danu triedu implementovat porovnavacie rozhranie Comparable v Tvojom pripade 

class Firma implements Comparable<Firma> {

	...
	public int compareTo(Firma f) {
		...
	}
}

a potom mozes sortovat napriklad 

List<Firma> firmy = new ArrayList<Firma>();
Collections.sort(firmy);

Iny sposob je napisat si vlastny Comparator 

public class FirmaComparator implements Comparator<Firma> {
	public int compare(Firma o1, Firma o2) {
		// obdobna logika ako v metodke int compareTo(Firma f)
	}
}

a potom sortujes nasledovne 

List<Firma> firmy = new ArrayList<Firma>();
Collections.sort(firmy, new FirmaComparator());
Nahlásit jako SPAM
IP: 195.28.127.–
Pruchalik
~ Anonymní uživatel
7 příspěvků
13. 11. 2012   #9
-
0
-

Zdravím,

mám taky problém udělal jsem to celé přes vlastní Comparator akorat mi to pořád hází chybu <identifier> expected u  řádku s Collections.sort em

Nahlásit jako SPAM
IP: 78.45.92.–
Dano
~ Anonymní uživatel
100 příspěvků
13. 11. 2012   #10
-
0
-

#9 Pruchalik
Mozes prilozit stacktrace resp. ukazku kodu?

Nahlásit jako SPAM
IP: 195.28.127.–
Pruchalik
~ Anonymní uživatel
7 příspěvků
13. 11. 2012   #11
-
0
-

public class PorovnaniZnamekDleAbecedy implements Comparator<Znamka>
    {
        public int compare(Znamka prvni, Znamka druha){
            String znamkaPrvni = prvni.getNazev();
            String znamkaDruha = druha.getNazev();
            return znamkaPrvni.compareTo(znamkaDruha);

        }
    }   
List<Znamka> znamky = new ArrayList<Znamka>();
    Collections.sort(znamky, new PorovnaniZnamekDleAbecedy());
   
   
}

třída známka ypada uplně stejně jako ude přiložená třída firma

Nahlásit jako SPAM
IP: 78.45.92.–
Dano
~ Anonymní uživatel
100 příspěvků
13. 11. 2012   #12
-
0
-

#11 Pruchalik
Vyzera to spravne, nezamotal si sa v balickoch?

priklad, majme balicek com.programujte.sortovanie a v nom triedu Znamka 

public class Znamka {
    private String nazev;
    private int cislo;

    public String getNazev() {
        return nazev;
    }

    public void setNazev(String nazev) {
        this.nazev = nazev;
    }

    public int getCislo() {
        return cislo;
    }

    public void setCislo(int cislo) {
        this.cislo = cislo;
    }
}

dalej custom sorter pre Znamka 

public class PorovnaniZnamekDleAbecedy implements Comparator<Znamka> {
    public int compare(Znamka prvni, Znamka druha) {
        String znamkaPrvni = prvni.getNazev();
        String znamkaDruha = druha.getNazev();
        return znamkaPrvni.compareTo(znamkaDruha);

    }
}

a nieco, kde to vsetko spajam dokopy, trieda Main 

public class Main {

    public static void main(String[] args) {
        List<Znamka> znamky = new ArrayList<Znamka>();
        Collections.sort(znamky, new PorovnaniZnamekDleAbecedy());
    }
}

a vsetko beha tak ako ma, bez ziadnych chyb.

Nahlásit jako SPAM
IP: 195.28.127.–
Pruchalik
~ Anonymní uživatel
7 příspěvků
13. 11. 2012   #13
-
0
-

Mám dvě třídy Znamka a k ní mám ještě seznamZnamek

Nahlásit jako SPAM
IP: 78.45.92.–
Dano
~ Anonymní uživatel
100 příspěvků
13. 11. 2012   #14
-
0
-

Predpokladam, ze tu chybu Ti hlasi IDE? Skus prekontrolovat ci si nezabudol dat pred Collections.sort( ... ); bodkociarku a dufam, ze Collections je z balicka java.util ;) Ked je vsetko oki, ak mozes, hod sem cely kod, ako to mas nakodene a budeme si na istom o com tocime ;)

Nahlásit jako SPAM
IP: 195.28.127.–
Pruchalik
~ Anonymní uživatel
7 příspěvků
13. 11. 2012   #15
-
0
-

import java.util.Collections;
import java.util.HashSet;
import java.util.Comparator;
import java.util.*;

/*******************************************************************************
* Instance třídy Znamka popisuje medovou turistickou známku.
*
* @author    Luboš Pavlíček
* @version   23. 11. 2011
*/
public class Znamka
{
    //== Datové atributy (statické i instancí)======================================
    private String nazev;  // název známky (název místa prodeje medové známky)
    private int cislo;     // číslo medové známky

    /***************************************************************************
     *  Pomocí konstruktoru se vytváří instance popisující medovou turistickou známku.
     *  @param  nazev       název medové známky
     *  @param  cislo       číslo medové známky,
     */
    public Znamka(String nazev, int cislo) {
        this.nazev = nazev;
        this.cislo = cislo;
    }

    /**
     * metoda vrací název známky
     * @return   název známky
     */
    public String getNazev() {
        return nazev;
    }

    /**
     * metoda vrátí číslo známky
     * @return      číslo známky
     */
    public int getCislo() {
        return cislo;
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof Znamka) {
            Znamka druha = (Znamka) o;
            return nazev.equals(druha.nazev);
        }
        return false;
        /*
        if (this == o){//psano kvuli tomu aby pocitac3 nemel stejny inv cislo jako pocitac1 coz by jinak neslo zjistit
        return true;
        }
        if(! (o instanceof Znamka) ){
        return false; 
        }
        Znamka druhy = (Znamka)o; //pretypovat -> nasleduje true false aby se to nepslao dvakrat
        return (this.cislo == druhy.cislo );
         */

    }

    @Override
    public int hashCode() {
        return nazev.hashCode();
    }

    public class PorovnaniZnamekDleAbecedy implements Comparator<Znamka>
    {
        public int compare(Znamka prvni, Znamka druha){
            String znamkaPrvni = prvni.getNazev();
            String znamkaDruha = druha.getNazev();
            return znamkaPrvni.compareTo(znamkaDruha);

        }
    } 

     List<Znamka> znamky = new ArrayList<Znamka>();
    Collections.sort(znamky, new PorovnaniZnamekDleAbecedy());
    

  
}

Nahlásit jako SPAM
IP: 78.45.92.–
Dano
~ Anonymní uživatel
100 příspěvků
13. 11. 2012   #16
-
0
-

Problem je v tom, ze kod  

Collections.sort(znamky, new PorovnaniZnamekDleAbecedy());

By si mal pouzit na mieste kde chces sortovat. Tebou umiestneny kod je mimo metody a nie je to deklaracia premennej ako napriklad riadok vysie, kde definujes znamky. Predpokladam, ze niekde si znamky naplnas, tam by si mal aj znamky sortovat. Resp, sortovanie zavri do metodky 

/**
 * Sortuje zoznam znamok
 * 
 * @param znamky
 */
public void sort(List<Znamka> znamky) {
    Collections.sort(znamky, new PorovnaniZnamekDleAbecedy());
}
Nahlásit jako SPAM
IP: 195.28.127.–
Pruchalik
~ Anonymní uživatel
7 příspěvků
13. 11. 2012   #17
-
0
-

o mi pro zmenu hlasi ze to nemuze najit  (cannot find symbol - class PorovnaniZnamekDleAbecedy

Nahlásit jako SPAM
IP: 78.45.92.–
Dano
~ Anonymní uživatel
100 příspěvků
13. 11. 2012   #18
-
0
-

Prosim Ta, bud trochu viac opisny   Co si urobil alebo zmenil a kde? V trieden Znamka? 

Nahlásit jako SPAM
IP: 195.28.127.–
Pruchalik
~ Anonymní uživatel
7 příspěvků
13. 11. 2012   #19
-
0
-

Jasne promin :-D

takze mam tridu znamka:

import java.util.Collections;
import java.util.HashSet;
import java.util.Comparator;
import java.util.*;

/*******************************************************************************
* Instance třídy Znamka popisuje medovou turistickou známku.
*
* @author    Luboš Pavlíček
* @version   23. 11. 2011
*/
public class Znamka
{
    //== Datové atributy (statické i instancí)======================================
    private String nazev;  // název známky (název místa prodeje medové známky)
    private int cislo;     // číslo medové známky

    /***************************************************************************
     *  Pomocí konstruktoru se vytváří instance popisující medovou turistickou známku.
     *  @param  nazev       název medové známky
     *  @param  cislo       číslo medové známky,
     */
    public Znamka(String nazev, int cislo) {
        this.nazev = nazev;
        this.cislo = cislo;
    }

    /**
     * metoda vrací název známky
     * @return   název známky
     */
    public String getNazev() {
        return nazev;
    }

    /**
     * metoda vrátí číslo známky
     * @return      číslo známky
     */
    public int getCislo() {
        return cislo;
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof Znamka) {
            Znamka druha = (Znamka) o;
            return nazev.equals(druha.nazev);
        }
        return false;
        /*
        if (this == o){//psano kvuli tomu aby pocitac3 nemel stejny inv cislo jako pocitac1 coz by jinak neslo zjistit
        return true;
        }
        if(! (o instanceof Znamka) ){
        return false; 
        }
        Znamka druhy = (Znamka)o; //pretypovat -> nasleduje true false aby se to nepslao dvakrat
        return (this.cislo == druhy.cislo );
         */

    }

    @Override
    public int hashCode() {
        return nazev.hashCode();
    }
  
    public class PorovnaniZnamekDleAbecedy implements Comparator<Znamka>
    {
        public int compare(Znamka prvni, Znamka druha){
            String znamkaPrvni = prvni.getNazev();
            String znamkaDruha = druha.getNazev();
             return znamkaPrvni.compareTo(znamkaDruha);
            //return prvni.getNazev().compareToIgnoreCase(druha.getNazev());
        }
    } 

  
}

a pak k ni mam tridu seznamznamek:

/* Soubor je ulozen v kodovani UTF-8.
* Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy. */

import java.util.Collections;
import java.util.HashSet;
import java.util.Comparator;
import java.util.*;

/*******************************************************************************
* Instance třídy SeznamZnamek představují ...
*
* @author    Šimon Průcha
* @spoluprace    Jaroslav Červinka
* @version   0.00.000
*/
public class SeznamZnamek
{
    //== Datové atributy (statické i instancí)======================================
    private Collection<Znamka> seznamZnamek;
    //== Konstruktory a tovární metody =============================================

    /***************************************************************************
     *  Konstruktor ....
     */
    public SeznamZnamek()
    {
        seznamZnamek = new ArrayList<>();//HashSet<>();  
    }

    //== Nesoukromé metody (instancí i třídy) ======================================
    public boolean vlozZnamku(Znamka znamka){
        if(seznamZnamek.contains(znamka)){
            return false;
        }
        else {
            seznamZnamek.add(znamka);
            return true;
        }
    }

    public Znamka vratZnamku(int cislo){
        Znamka zadna = null;
        for(Znamka prvek : seznamZnamek){//pro kazdej prvek typu pocitacu
            if(prvek.getCislo() == cislo){
                zadna = prvek;
                //seznam.remove(ruseny);
                break;
            }
        }
        return zadna;

    }

    public Collection<Znamka> znamky(){
        return seznamZnamek;

    }

    public boolean jeCisloVolne (int cislo)
    {
        for(Znamka znamka : seznamZnamek)
        {
            if(znamka.getCislo() == cislo)
            {
                return false;
            }
        }
        return true;
    }
    //== Soukromé metody (instancí i třídy) ========================================

   
   
    public void sort(List<Znamka> znamky) {
        Collections.sort(znamky, new PorovnaniZnamekDleAbecedy());
    }
   
}

Nahlásit jako SPAM
IP: 2001:718:1e02:8144::bead:...–
Dano
~ Anonymní uživatel
100 příspěvků
13. 11. 2012   #20
-
0
-

Triedu PorovnaniZnamekDleAbecedy by som vysunul von z triedy Znamka a potom v SeznamZnamek by som ju klasicky importol, ak by bola na tej istej urovni ako je Znamka, tak ani importnut netreba ;)

nieco taketo:

com.programujte.znamka.Znamka

com.programujte.znamka.SeznamZnamek

com.programujte.znamka.PorovnaniZnamekDleAbecedy

Nahlásit jako SPAM
IP: 78.98.66.–
Pruchalik
~ Anonymní uživatel
7 příspěvků
14. 11. 2012   #21
-
0
-

Ok, díky moc, že ses s tím tak štval:)zkusím to tak...

Nahlásit jako SPAM
IP: 78.45.92.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 28 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý