Avatar billede Bennysørensen Praktikant
27. oktober 2003 - 21:39 Der er 16 kommentarer og
1 løsning

Kopiering fra list over til Map

Opgaven går ud på at tælle antallet af hver enkelt ord i en tekst. Teksten ligger som linket list, og jeg har ingen problemer i at kopiere den over i f.eks et treemap eller en arraylist.

Jeg skal tælle hvert ord og så lægge dem over i et map, med ord som key og antal som value. Dér skal de ligge alfabetisk.

Jeg er med på at en Collections.sort(aList) giver mig en alfabetisk sorteret liste med dubletter, så det er jo en fin start.

Jeg har lavet denneher funktion:

Object element1 = null, element2 = null;
      int antal = 1, l = 1;
      for (int a=0; a < cList.size()-1; a++)
      {
          for (int m = 0; m <= cList.size()-1; m++)
          {
              element1 = cList.get(m);               
              element2 = cList.get(l);               

              if (element1.equals(element2))         
              {
                  antal++;                           
              }           
          }
l++;                                                    antal=1;                                                hList.put(element1, new Integer(antal));
      }
..og den tæller ordernes forekomster (dog ikke det første, jeg aner ikke hvorfor).

Jeg aner ikke om det bliver lagt over i HashMap'et, eftersom jeg ikke kan finde ud af at skrive det ud, men jeg kan ikke bruge funktionen på en Sorteret list.

Arraylist a2List = new ArrayList();
a2List.addAll(Collections.sort(aList));

...virker ikke.

Desuden er jeg overbevist om at det kan laves meget, meget smartere end min idé....nogle bedre løsninger (well, de bliver allesammen bedre, eftersom min ikke virker)?
Avatar billede arne_v Ekspert
27. oktober 2003 - 21:49 #1
En HashMap kan bare printes da den har en fornuftig toString metode.
Avatar billede arne_v Ekspert
27. oktober 2003 - 21:49 #2
Jeg tror at:

for (int a=0; a < cList.size()-1; a++)

skal være:

for (int a=0; a <= cList.size()-1; a++)

eller:

for (int a=0; a < cList.size(); a++)
Avatar billede arne_v Ekspert
27. oktober 2003 - 21:51 #3
Man kan ikke putte en HashMap over i en ArrayList fordi en HashMap indeholde
keys+values mens en ArrayList kun indeholder elementer.

En HashMap kan blive til 2 ArrayList's en med keys og en med values eller
en ArrayList med elemnter af et objekt som indeholder key og value.

Men jeg tror slet ikke at du vil have den over i en ArrayList !

Er HashMap ikke god nok ?
Avatar billede arne_v Ekspert
27. oktober 2003 - 21:53 #4
Du kan jo f.eks. løbe igennem en HashMap med hm.keySet().iterator()
Avatar billede arne_v Ekspert
27. oktober 2003 - 21:54 #5
Et eksmepel på sortering af HashMap:

import java.util.Arrays;
import java.util.HashMap;

public class HashMapSort {
    public static void main(String[] args) {
        HashMap hm = new HashMap();
        hm.put("c","3");
        hm.put("b","2");
        hm.put("a","1");
        System.out.println(hm);
        Object[] sa = hm.keySet().toArray();
        Arrays.sort(sa);
        for(int i = 0; i < sa.length; i++) {
            String key = (String)sa[i];
            String value = (String)hm.get(key);
            System.out.println(key + "->" + value);
        }
       
    }
}
Avatar billede Bennysørensen Praktikant
27. oktober 2003 - 22:09 #6
Det er ikke det store problem for mig at tælle ordene selv og så tampe alle værdierne ind, men idéen er at gøre det smartere. Altså tage en sorteret arraylist med dubletter via Collections.sort, tælle hvert enkelt ords antal af forekomster, og så lægge det over i et map. Det er ikke mappet, der skal over i arraylisten.
Avatar billede Bennysørensen Praktikant
27. oktober 2003 - 22:14 #7
Opgavetekst(for at jeg ikke forklarer problemet forkert):

"Udskriv hvor mange elementer der er af hver type. Du skal udskrive alementerne i alfabetisk rækkefølge. (Hint: Kopier elementerne over i en passende type map, idet du gemmer elementerne sådan her: (af->2), (aftalebogen->3) osv...du har element som key, og lagrer tallet som et Integer-objekt, der gøres én større for hvert element af typen, du finder.)"

...det kunne også bare være at jeg skulle spørge "hvordan gør man dét smart?"
Avatar billede arne_v Ekspert
27. oktober 2003 - 22:14 #8
Jamen er det ikke det som din kode gør ?

(bortset fra at du sammenligner med alle elementer og ikke udnytter sorteringen)
Avatar billede arne_v Ekspert
27. oktober 2003 - 22:16 #9
Jeg ville nok bare løbe igennem og lave enten "INSERT" eller "UPDATE"
for hvert gennemløb.
Avatar billede Bennysørensen Praktikant
27. oktober 2003 - 22:21 #10
Min kode virker ikke på noget, der er sorteret, og dét er en fejl, eftersom jeg ikke rigtigt aner hvordan jeg skal sortere mappet efter at jeg har lagt værdierne over i det.

Desuden er der stadig problemet med det første ord, der ikke bliver sorteret.

Jeg kan ikke finde toString() for HashMap i min Java SDK...
Avatar billede arne_v Ekspert
27. oktober 2003 - 22:23 #11
Man kan ikke sortere en Map.

Men du kan udskrive den sorteret - se mit tidligere stykke kode.

Der er en toString - den er bare arvet fra AbstractMap !
Avatar billede arne_v Ekspert
27. oktober 2003 - 22:24 #12
Noget kode med INSERT/UPDATE:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Count {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("a");
        list.add("d");
        list.add("b");
        list.add("a");
        Map map = count(list);
        System.out.println(map);
    }
    public static Map count(List list) {
        Map res = new HashMap();
        for(int i = 0; i < list.size(); i++) {
            String s = (String)list.get(i);
            Integer val = (Integer)res.get(s);
            if(val != null) {
                res.put(s, new Integer(val.intValue() + 1));
            } else {
                res.put(s, new Integer(1));
            }
        }
        return res;
    }
}
Avatar billede Bennysørensen Praktikant
27. oktober 2003 - 22:25 #13
...og jeg kan ikke få lov at lave en iterator i stil med
Iterator j = hList.iterator();
        while( h.hasNext() )
                {
            System.out.println( h.next() );                         
        }

...hvor man vist også skal bruge Collections.value()
Avatar billede Bennysørensen Praktikant
27. oktober 2003 - 22:27 #14
arne_v, jeg er meget imponeret af din lyst til at kommentere på alle mine spørgsmål...men jeg vil også gerne give dig nogle point, så kan du ikke snige et svar ind hist og her? :o)
Avatar billede arne_v Ekspert
27. oktober 2003 - 22:31 #15
OK
Avatar billede arne_v Ekspert
27. oktober 2003 - 22:31 #16
Komplet eksempel:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class Count {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("a");
        list.add("c");
        list.add("b");
        list.add("a");
        Map map = count(list);
        System.out.println(map);
        System.out.println("Usorteret");
        Iterator it = map.keySet().iterator();
        while (it.hasNext()) {
            String key = (String)it.next();
            Integer value = (Integer) map.get(key);
            System.out.println(key + "->" + value);
        }
        System.out.println("Sorteret");
        Object[] sa = map.keySet().toArray();
        Arrays.sort(sa);
        for (int i = 0; i < sa.length; i++) {
            String key = (String) sa[i];
            Integer value = (Integer) map.get(key);
            System.out.println(key + "->" + value);
        }
    }
    public static Map count(List list) {
        Map res = new HashMap();
        for (int i = 0; i < list.size(); i++) {
            String s = (String) list.get(i);
            Integer val = (Integer) res.get(s);
            if (val != null) {
                res.put(s, new Integer(val.intValue() + 1));
            } else {
                res.put(s, new Integer(1));
            }
        }
        return res;
    }
}
Avatar billede Bennysørensen Praktikant
29. oktober 2003 - 18:14 #17
...og den forventede løsning er så denneher:
       
      //f
      Map mMap = new TreeMap();
     
      Iterator it = aList.iterator();
      while (it.hasNext())
      {
              String str = (String)it.next();
              if (mMap.containsKey(str))   
              {
                  Integer integer = (Integer) mMap.get(str);
                  int value = integer.intValue();
                  value++;
                  mMap.put(str, new Integer(value));
              }
              else
              {
                  mMap.put(str, new Integer(1));
              }
      }
      System.out.println(mMap);
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester