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
Fórum › Java
Seřazení ArrayListu abecedně
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?
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
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..
ukaž jak vypadá tvoje třída Firma
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
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;
}
}
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")
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
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());
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
#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.
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 ;)
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());
}
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());
}
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());
}
}
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
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Nezapisuje do Arraylistu :/ — založil dEVIANT
Řazení ArrayListu — založil Qwerty
Přístup k prvkum v 3D nafukujicim ArrayListu — založil Tedd
Android uložení/načtení arraylistu do/z XML souboru — založil ats
Vždy uloži pouze poslední hodnoty do seznamu (ArrayListu) a minulé s… — založil lenochod
Moderátoři diskuze