Kolekce->HashMap->Trideni podle vlastnosti vlozeho objektu – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Kolekce->HashMap->Trideni podle vlastnosti vlozeho objektu – Java – Fórum – Programujte.comKolekce->HashMap->Trideni podle vlastnosti vlozeho objektu – Java – Fórum – Programujte.com

 

15. 1. 2008   #1
-
0
-

Ahoj, jsem začátečník v Javě a potřeboval bych poradit. Chci si udělat takového souborového komandera a vymýšlím třídu, která mi bude třídit soubory. Ale narazil jsem na kámen úrazu, protože všude se popisují třídící funkce jen k ArrayListu. A ten tam samozřejmě nemám.

ten můj prográmek:



package filemanager;
import java.util.*;
import java.io.File;
import java.util.Date;
import java.text.SimpleDateFormat;


public class S_seznam {

Map<String, soubor> kon;

public S_seznam() {
kon = new HashMap<String, soubor>();
}

private class soubor {
private String nazev;
private long datum;
private String datum_upr;
private long velikost;

// private int systemovy;
private int pro_cteni;
private int skryty;
// private int archivni;

// private int spustitelny;
private int adresar;

// Konstruktory
public soubor(){}
public soubor(String nazev) {this.nazev = nazev;}
public soubor(String nazev, long datum) {this.nazev=nazev; this.datum = datum;}
public soubor(String nazev, long datum, long velikost) {this.nazev=nazev; this.datum = datum; this.velikost = velikost;}
// public soubor(String nazev, long datum, long velikost, int systemovy) {this.nazev=nazev; this.datum = datum; this.velikost = velikost; this.systemovy = systemovy;}
// public soubor(String nazev, long datum, long velikost, int systemovy, int pro_cteni) {this.nazev=nazev; this.datum = datum; this.velikost = velikost; this.systemovy = systemovy; this.pro_cteni = pro_cteni;}
// public soubor(String nazev, long datum, long velikost, int systemovy, int pro_cteni, int skryty) {this.nazev=nazev; this.datum = datum; this.velikost = velikost; this.systemovy = systemovy; this.pro_cteni = pro_cteni; this.skryty = skryty;}
// public soubor(String nazev, long datum, long velikost, int systemovy, int pro_cteni, int skryty, int archivni) {this.nazev=nazev; this.datum = datum; this.velikost = velikost; this.systemovy = systemovy; this.pro_cteni = pro_cteni; this.skryty = skryty; this.archivni = archivni;}
// public soubor(String nazev, long datum, long velikost, int systemovy, int pro_cteni, int skryty, int archivni, int spustitelny) {this.nazev=nazev; this.datum = datum; this.velikost = velikost; this.systemovy = systemovy; this.pro_cteni = pro_cteni; this.skryty = skryty; this.archivni = archivni; this.spustitelny=spustitelny;}

// Nastavitelne vlastnosti
public void set_nazev(String nazev) {this.nazev = nazev;}
public void set_datum(long datum) {this.datum = datum;}
public void set_velikost(long velikost) {this.velikost = velikost;}
// public void set_systemovy(int stav) {this.systemovy = stav;}
public void set_pro_cteni(int stav) {this.pro_cteni = stav;}
public void set_skryty(int stav) {this.skryty = stav;}
// public void set_archivni(int stav) {this.archivni = stav;}
// public void set_spustitelny(int stav) {this.spustitelny = stav;}
public void set_datum_upr(String udatum) {this.datum_upr = udatum;};
public void set_adresar(int stav) {this.adresar = stav;}

// Vlastnosti ktere jdou cist
public String get_nazev() {return this.nazev;}
public long get_datum() {return this.datum;}
public long get_velikost() {return this.velikost;}
// public int get_systemovy() {return this.systemovy;}
public int get_pro_cteni() {return this.pro_cteni;}
public int get_skryty() {return this.skryty;}
// public int get_archivni() {return this.archivni;}
// public int get_spustitelny() {return this.spustitelny;}
public String get_datum_upr() {return this.datum_upr;}
public int get_adresar() {return this.adresar;}

public int exist() {
File f = new File(this.nazev);
if (f.exists()) {
return 1;
}
return 0;
}

public int refresh_attr() {
if (this.exist()==1) {
File t_file = new File(this.get_nazev());

// velikost souboru
this.velikost = t_file.length();

// datum
this.datum = t_file.lastModified();
Date dat_tmp = new Date(this.datum);
SimpleDateFormat dat = new SimpleDateFormat();

dat.applyPattern("dd.MM.yyyy-H:mm:ss");
this.datum_upr = dat.format(dat_tmp);

// je soubor skryty?
if (t_file.isHidden()==true) {this.skryty = 1;}
// je soubor adresar?
if (t_file.isDirectory()==true) {this.adresar = 1;}
// pokud je read-only
if (t_file.canWrite()==false) {this.pro_cteni = 1;}
// spustitelny
// if (t_file.canExecute()==true) {this.spustitelny = 1;}


}

return 0;
}


}

public int add(String cesta) {
soubor mujsoubor = new soubor(cesta);
if (mujsoubor.exist()==0) {return 0;}

kon.put(mujsoubor.get_nazev(), mujsoubor);


return 1;
}

public int exist(String nazev) {
//soubor mujsoubor = new soubor(nazev);

if (kon.containsKey(nazev)==true) {
return 1;
}else {
return 0;}
}

public int remove(String nazev){

if (this.exist(nazev)==1) {
if (kon.remove(nazev)!=null) {
return 1;
}
}

return 0;
}

public void refresh_attr() {
Iterator it = kon.keySet().iterator();
soubor t_soubor = new soubor();

while(it.hasNext()){
t_soubor = kon.get(it.next());

t_soubor.refresh_attr();
}
}

public void vypis() {
Iterator it = kon.keySet().iterator();
String jmeno;

while(it.hasNext()){
jmeno = (String)it.next();

System.out.print(jmeno+" ");

if (kon.get(jmeno).get_skryty()==1) {System.out.print("-H");}
if (kon.get(jmeno).get_pro_cteni()==1) {System.out.print("-R");}
// if (kon.get(jmeno).get_spustitelny()==1) {System.out.print("-E");}



System.out.print("\n");
}
}

public void test() {


}


}


promena kon je tedy deklarovana jako Hashmapa a ukladam do ni objekt soubor, ktery ma ruzne vlastnosti (get_velikost, get_datum pod). Jenze kdyz tech chci napr vsechny objekty vlozene v promene kon seradit podle vlastnosti soubor.get_velikost jak to mam udelat? Cetl jsem ze existuje nejaka trida Comparable ale nechapu jak bych si ji mel upravit k tomu aby delala to co potrebuju.

Ma nekdo nejaky napad prosim?

Nahlásit jako SPAM
IP: 81.30.228.–
Jura
~ Anonymní uživatel
637 příspěvků
15. 1. 2008   #2
-
0
-

zdravím,

vzhledem k tomu,že HashMap neobsahuje konstruktor kterému by se předala třída implementující Comparator, tak bych navrhoval, předat hashMapu TreeMap, která už obsahuje konstruktor, kterému se předá objekt třídy Comparator.
Z tohoto odkazu to už snad poskládáš:
http://kickjava.com/753.htm
Pokud to není pořád není jasné, tak se ptej dále a někdo ti jistě odpoví.

Nahlásit jako SPAM
IP: 85.207.192.–
15. 1. 2008   #3
-
0
-

To Jura :

Tak děkuju link jsem si přečetl a zkusím to udělat přes tu TreeMapu, ale ten Comparator mi neni jasný. Může to někdo polopaticky vysvětlit prosím?

Nahlásit jako SPAM
IP: 81.30.228.–
Jura
~ Anonymní uživatel
637 příspěvků
16. 1. 2008   #4
-
0
-

Koukám, že se k tomu nikdo nemá..:)

No, jediné o co jde, je to, že musíš mapě, resp. TeeMapě říct,jak chceš jednotlivé položky mít etřízení. A právě k tomuto účelu slouží ionterface Comparator. Ten má dvě metody compare,ta shodou náhod slouží právě k onomu setřízení a equals.
No,nebudu teď nic zkoušet jen napíšu jakby to asi mohlo fungovat:



public TreeMap sortByLength(Map<String,soubor> m)
{ TreeMap t = new TreeMap( new Comparotor()
{ public int compare(Object o1, Object o2)
{ soubor s1 = (soubor) o1, s1 = (soubor)o2;
Long l1 = (Long) s1.get_length(), l2=(Long) s2.getLength();

return l1.compareTo(l2); // nebo naopak
}
});
t.putAll( m );
return t;
}


Obdobně pro setrizeni napr.podle Data, parametru, atd..
Pouziti:


....
System.out.println(sortByLength(kon));
....

No,snad tam není příliš mnoho chyb..

Nahlásit jako SPAM
IP: 85.207.192.–
22. 1. 2008   #5
-
0
-

To Jura :
ahoj, zkoušel jsem to a nefunguje mi to. Nemáš třeba icq ?
jestli jo, a byl bys ochoten si o tom popovídat tak mi ho prosím pošli na mail kos@pamal.info

Nahlásit jako SPAM
IP: 83.208.141.–
Jura
~ Anonymní uživatel
637 příspěvků
23. 1. 2008   #6
-
0
-

No, tak nakonec to pomocí TreeMapy asi nepůjde, proto jsem nakonec použil ArrayList. Snad to dělá požadovanou operaci.




public class ZooperObj {
public String name;
public Integer value;

public ZooperObj(String str, int num)
{
name = str;
value = new Integer(num);
}
}




import java.util.*;

public class Main {

Map<String, ZooperObj> mData;

public Main()
{
mData = new HashMap<String, ZooperObj>();
mData.put("1", new ZooperObj("Abc", 5));
mData.put("2", new ZooperObj("def", 4));
mData.put("3", new ZooperObj("ghi", 6));
mData.put("4", new ZooperObj("ghi", 6));


}

public ArrayList<Map.Entry<String, ZooperObj> > sortByValueDesc(Map<String, ZooperObj> m)
{
ArrayList<Map.Entry<String, ZooperObj> > temp =
new ArrayList<Map.Entry<String, ZooperObj> >(m.entrySet());
Collections.sort(temp, new Comparator<Map.Entry<String, ZooperObj> >()
{
public int compare(Map.Entry<String, ZooperObj> o1, Map.Entry<String, ZooperObj> o2)
{

ZooperObj z1 = o1.getValue();
ZooperObj z2 = o2.getValue();
return z2.value.compareTo(z1.value);
}
});

return temp;
}



public void Run()
{
ArrayList<Map.Entry<String, ZooperObj> > set = sortByValueDesc(mData);
for(Iterator< Map.Entry<String, ZooperObj> > i=set.iterator(); i.hasNext(); )
{ Map.Entry<String, ZooperObj> obj = i.next();
System.out.println(obj.getKey() +"=ZooperObj("+obj.getValue().name+", "+obj.getValue().value+")\n");

}
}

public static void main(String[] args) {

Main m = new Main();
m.Run();


}

}


Je to jen ilustrační příklad.
Jinak tohle forum je tu pro všechny zainteresované, takže proto to raději postnu sem. A možná se to bude někdy někomu taky hodit.

Nahlásit jako SPAM
IP: 85.207.192.–
1. 2. 2008   #7
-
0
-

Ahoj,
tak ten ukázkový příklad mi píše mnoho syntaktických chyb.

Nahlásit jako SPAM
IP: 83.208.141.–
Jura
~ Anonymní uživatel
637 příspěvků
1. 2. 2008   #8
-
0
-

To Zone_Trooper :
Zdravím,

podivné, mně to jede v pohodě. Jakou máš verzi JDK?? Mě to jede s verzí Javy 1.6 naprosto bez problemu.

Nahlásit jako SPAM
IP: 85.207.192.–
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, 30 hostů

Podobná vlákna

Třídění ArrayList HashMap — založil rmaster

Python třídění podle QR — založil Daniel Pallavicini

Třídění podle názvu — založil Honza

Moderátoři diskuze

 

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