20. december 2006 - 13:07Der er
8 kommentarer og 1 løsning
Optælling af array
Hej eksperter, Jeg har et array med omkring 1500 elementer, bestående af kommuner. Jeg vil gerne have arrayet 'sorteret', så jeg får hvilke værdier og hvor mange af hver returneret?
Jeg er ikke helt sikker på hvad det er din opgave består i ..
I java er der tradition for at sortere med en Comparator. Det er et sted at starte. Sådan een kan du selv kode, og derved kan du så opsamle data om, hvormange af de 1500 der har hvilke attributter.
Jeg fortæller dig at du er nødt til at sige lidt mere om hvori din opgave består. Som det er nu, ved jeg ikke andet end at du vil sortere et array, og at du vil have talt dine objecter op på een eller anden måde..
Og så siger - til din information - at man bruger Comparator klasser når man laver sortering i javaklasser. Comparator er et interface du kan implementere. Derefter kan du benytte din Comparator til at sortere med: Collections.sort(list, comparator), hvor "list" er en dit Array oversat til en java.util.List.
Ok, jeg har et array med kommunenavne ala: Aalborg, Hals, osv. Mange af navnene går igen i arrayet. Jeg vil så gerne have array sorteret, således, at jeg får både værdierne, altså Aalborg, Hals osv, og hvor mange gange de eksisterer i arrayet. Helt specifikt prøver jeg at afbilde arrayet grafisk, med EasyCharts som kræver værdierne som input. Håber I forstår, eller kan jeg godt prøve at forklare bedre...
Jeg regner med du har følgende klasser: Kommune kommune. <implements Comparable> Kommune[] kommunerne.
1. Nu forstår jeg bedre. Jeg tror jeg ville starte med at lave arrayet om til en collection.
List kommuneList = new ArrayList(); kommuneList.addAll(kommunerne);
2. Derefter vil jeg sortere det efter kommunenavne med Comparator-pattern.
En comparator kan se således ud: public class KommuneComparator implements Comparator { public int compare(Object o1, Object o2) { Kommune kommune1 = (Kommune)o1; Kommune kommune2 = (Kommune)o2; return (kommune1.getNavn().compare(kommune2.getNavn())) } }
List sortedKommuneList = Collections.sort(kommuneList, new KommuneComparator());
3. Så vil jeg iterere igennem min sorterede liste med en counter der tæller een op hele tiden.
Hertil ville opfinde en klasse der kunne indeholde både en Kommunne og et tal: KommuneWrapper kommuneWrapper;
Og en liste til at holde dem i: List kommuneWrappers = new ArrayList();
String oldName = ""; int counter = 0 ; for (int i=0; i<sortedKommuneList.size(); i++){ Kommune kommune = (Kommune)sortedKommuneList.get(i); if (!(kommune.getNavn().equals(oldName))){ kommuneWrappers.add(new KommuneWrapper(kommune, counter)); counter = 0; } oldName=kommune.getNavn(); counter++; }
4. Så har du en sorteret liste af KommuneWrappers du kan bruge ..
Det er pseudokode, og ikke hverken kompileret ekker testet :)
Jeg har gjort det på en lidt anden måde: public void sort (Vector dataGF,Vector ugeregisGF) { Collections.sort(ugeregisGF); Collections.sort(dataGF); if (kommunerCB.isSelected()) { int tal = 0;
for (int i = 1; i < dataGF.size(); i++) { if (dataGF.get(i).equals(dataGF.elementAt(i - 1))) { tal++; } else { count.add("" + tal); data.add(dataGF.elementAt(i).toString()); tal = 0; } } } if (ugeregisGF.size()>0) { int tal = 1; for (int i = 1; i < ugeregisGF.size(); i++) { if (ugeregisGF.get(i).equals(ugeregisGF.elementAt(i - 1))) { tal++; } else { count.add("" + tal); data.add(ugeregisGF.elementAt(i).toString()); tal = 1; } } barchart(); } Nu er data'en korrekt sorteret i de 2 vectorer, nemlig kommunenavn, og antal gange de er angivet. Nu vil jeg gerne have dem over i Easycharts, som tager en double og streng-array som input.
public void cirkel() { double[] sampleValues = new double[] {40,3000,1000}; Color[] sampleColors = new Color[] {new Color(0xcead9c), new Color(0x9c8400), new Color(0xadc694), new Color(0xcecece), new Color(0xe7ce6b)}; PieChart chart = new PieChart(); chart.setSampleCount(5); chart.setSampleValues(0,sampleValues); chart.setSampleLabels(new String[] {"Aalborg\n","Hjørring\n","Brønderslev\n","Thisted\n","Læsø\n"}); chart.setSampleLabelsOn(true); chart.setSampleLabelStyle(Chart.OUTSIDE); chart.setPercentLabelsOn(true); chart.setPercentLabelStyle(Chart.OUTSIDE); chart.setFont("outsideLabelFont", new Font("Arial", Font.BOLD, 11)); chart.setSampleColors(sampleColors); chart.setSliceSeperatorColor(Color.white); chart.set3DModeOn(true); chart.setDepth(0.12); chart.setAngle(55); chart.setPieRotationOn(true); chart.setBackground(Color.white); com.objectplanet.chart.NonFlickerPanel p = new com.objectplanet.chart.NonFlickerPanel(new BorderLayout()); kommunerP.add("Center", chart); } Håber der er en der kan hjælpe her, så det bliver dynamiske værdier i vectorerne og ikke de statiske der i forvejen er angivet.
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.