HashMap

  • Themenstarter Themenstarter ingo17
  • Beginndatum Beginndatum
I

ingo17

Gast
Hallo,

Kann mir jemand sagen, wieso bei mir führenden Nullen in der HashMap immer entfernt werden?
Java:
import java.util.*;

public class Maps 
{

	static HashMap<String, Integer> hm = new HashMap<String, Integer>();
	static int[] array = new int[11];
	static ArrayList<Integer> al = new ArrayList<Integer>();
	
	public static void main(String[] args) 
	{
		addName("test1", "0150 / 123456 (mobil)");
		addName("test2", "0150 8888");
		addName("test3", "075614");
		addName("Max Mustermann ", "88");
		addName("Max Musterfrau", "777");
		
		System.out.println(hm);
		
		System.out.println(findNumber("test1"));
	}
	
	private static void addName (String name, String number)
	{
		hm.put(name, telNumber(number));
	}
	
	private static int findNumber(String name)
	{
		if (hm.containsKey(name))
			return hm.get(name);
		else 
			return (Integer) null;
		
	}
	
	private static int telNumber(String number)
	{
		String str = "";
		for (int i=0; i<number.length(); i++)
		{
			if (Character.isDigit(number.charAt(i)))
			{
				str = str + number.charAt(i);
			}
		}
		return Integer.parseInt(str);
	}
}
 
Hallo ingo17,

du hast deine Hashmap als

Java:
 HashMap<String, Integer>

deklariert. Also ist das erste Argument vom Typ String und das Zweite vom Typ Integer.
Bei Integer fällt die 0 vorne weg.

Bei deinem ersten Datensatz:

Java:
 addName("test1", "0150 / 123456 (mobil)");

sollten sich eigentlich auch Probleme ergeben da das zweite Argument auch Buchstaben und Sonderzeichen enthält.
Spätestens beim Auslesen der Hashmap.

Definier deine Hashmap wiefolgt, dann funktionierts:
Java:
 HashMap<String, String>
 
Bei Integer fällt die 0 vorne weg.

Okay, alles klar. 🙂 Führende Nullen fallen weg, aber eine einzelne Null wird akzeptiert? Sehe ich das richtig?


Bei deinem ersten Datensatz:

Java:
 addName("test1", "0150 / 123456 (mobil)");

sollten sich eigentlich auch Probleme ergeben da das zweite Argument auch Buchstaben und Sonderzeichen enthält.
Spätestens beim Auslesen der Hashmap.
[/code]

Das dürfte soweit schon funktionieren, da diese Methode

Java:
	private static int telNumber(String number)
	{
		String str = "";
		for (int i=0; i<number.length(); i++)
		{
			if (Character.isDigit(number.charAt(i)))
			{
				str = str + number.charAt(i);
			}
		}
		return Integer.parseInt(str);
	}

ja sämtliche Zeichen, die keine Ziffer sind entfernt ?
 
Nur so nebenbei möchte ich anmerken das ein Integer z.b. für die meisten Berliner Festnetznummern nicht ausreicht. Speicher die Nummern entweder einfach nur als String oder als long mit einem zusätzlichen byte für die führenden Nullen.
 
So, danke soweit 🙂

Jetzt ist ein weiterer Fehler aufgetreten, welchen ich mir nicht erklären kann:


Java:
	private static ArrayList<String> detectName()
	{
		for (String keys : hm.keySet())
		{
			detection.add(keys);
		}
		
		for (int i=0; i<detection.size(); i++)
		{
			String str = detection.get(i);
			detection.remove(i);
			
			System.out.println("in: " +str);

			str = str.replace('a', '*');
			str = str.replace('e', '*');
			str = str.replace('i', '*');
			str = str.replace('o', '*');
			str = str.replace('u', '*');	

			System.out.println("out: " + str);
						
			detection.add(str);
		}
		
		return detection;
	}


Der oben gepostete Codeteil führt zu folgender Ausgabe:

in: Max Mustermann
out: M*x M*st*rm*nn
in: Max Musterfrau
out: M*x M*st*rfr**
in: test2
out: t*st2
in: M*x M*st*rm*nn
out: M*x M*st*rm*nn
in: t*st2
out: t*st2
in: t*st2
out: t*st2
[test1, test4, test3, M*x M*st*rfr**, M*x M*st*rm*nn, t*st2]


Wieso wird test1, test2, test3 falsch ausgegeben? Dabei müsste jedesmal die *-Variante (out) in der ArrayList stehen.
 
Es ist eine sehr schlechte Idee, über die Elemente einer Liste zu iterieren und innerhalb dieser Schleife Elemente aus der selben Liste zu entfernen und neue hinzuzufügen. Dabei kann alles durcheinander geraten. Leg dir eine neue Ergebnisliste an, die die Methode dann zurückliefert.
 
Jetzt ist ein weiterer Fehler aufgetreten, welchen ich mir nicht erklären kann:
Eine
Code:
ConcurrentModificationException
vlcht.? Das wäre das logische Resultat. Wie tfa schon sagte, kannst du nicht, während du über eine Liste iterierst, Elemente aus ihr löschen oder in sie hineinschieben. Ersteres würde glaub über den Listeniterator selbst noch geht (der kennt auch eine
Code:
remove()
-Methode), letzteres aber nicht mehr. U.U. könnte
Code:
ArrayList#set(int index, E element)
Abhilfe schaffen, weis gerade nicht genau, ob das auch eine Exception des selben Typs verurachen würde.


EDIT: Verdammte Axt... mein 1000er Beitrag und leider keine Floppy-Disk mehr ;(
 

Zurück
Oben