Map mit Vektor: Element hinzufügen

Migu

Mitglied
Hallo zusammen,

ich habe eine Frage bzgl Maps in Java (bin sonst eher an Maps in C++ gewöhnt)
Warum klappt folgendes nicht?

Java:
Map< String,Vector<Integer> > myMap = new HashMap<>();
for (int k=0; k<5; k++){
    myMap.get("1").addElement(k);
}

Ich will eigentlich nur dass je nachdem wie oft die Schleife durchgelaufen wird, auch der Vektor demetsprechen mit Daten gefüttert wird....

Als Fehlermeldung bekomme ich
Java:
Exception in thread "main" java.lang.NullPointerException
	at Test.main(Test.java:47)
Java Result: 1

Gruß
Migu
 
Zuletzt bearbeitet:

Fab1

Top Contributor
Java:
myMap.get("1")

Du bekommst ja eine NullPoiner Exception, somit gibt der Aufruf nichts zurück.
 

Camill

Bekanntes Mitglied
Wie Fab1 bereits schrieb tritt eine NullPointerException auf da sich in der HashMap noch kein Element(Vector) mit dem angegebenen Key "1" befindet. Folgendes wäre jedoch möglich:
Java:
Map<String, Vector<Integer>> map = new HashMap<>();
map.put("aKey", new Vector<Integer>());

for (int i = 0; i < 5; i++) {
	map.get("aKey").add(i);
}
 

fastjack

Top Contributor
Schreibe Dir eine Methode zum putten:

Code:
void put(String key, int value) {
    Vector<Integer> vector = myMap.get(key);
    if(vector == null) {
        vector = new Vector<Integer>();
        myMap.put(key, vector);
    }
    vector.addElement(value);
}

vorausgesetzt Du hat Zugriff auf myMap, ansonsten myMap als Parameter, vielleicht dann static method? Warum Vector und nicht List?
 

Helgon

Bekanntes Mitglied
Java:
Map< String,Vector<Integer> > myMap = new HashMap<>();

klappt nicht, weil es lauten müsste

Java:
Map<String, Vector<Integer>> myMap = new HashMap<String, Vector<Integer>>();
 

Camill

Bekanntes Mitglied
Java:
Map< String,Vector<Integer> > myMap = new HashMap<>();

klappt nicht, weil es lauten müsste

Java:
Map<String, Vector<Integer>> myMap = new HashMap<String, Vector<Integer>>();

Java:
Map< String,Vector<Integer> > myMap = new HashMap<>();
Reicht imho aus.
 

Migu

Mitglied
Schreibe Dir eine Methode zum putten:

Code:
void put(String key, int value) {
    Vector<Integer> vector = myMap.get(key);
    if(vector == null) {
        vector = new Vector<Integer>();
        myMap.put(key, vector);
    }
    vector.addElement(value);
}

vorausgesetzt Du hat Zugriff auf myMap, ansonsten myMap als Parameter, vielleicht dann static method? Warum Vector und nicht List?


Ich weiss nicht genau wie ich das auf mein Problem anpassen soll....
Am besten ist es ich poste mal mein ganzer Code. Also ich will eine txt Datei einlesen und die einzelnen Spalten als doubles in verschiedenen Vektoren/Lists speichern. Dazu dachte ich wäre ein Map gut weil über die Schlüssel kann ich dann sozusagen auf die Spalten zugreifen. Das ganze soll auch automatisiert passieren.

Mein Code:

[JAVA=42]
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Vector;


public class funcs {

public Map<String,Vector<Double>> ReadFile(String fileName, int numberOfColumns, int headerRows){
Map<String,Vector<Double>> outMap = new HashMap();

File file = new File(fileName);
try {
Scanner scanner = new Scanner(file).useDelimiter("\\s+");
for (int i=0; i<headerRows; i++) {scanner.nextLine();}

String key = "";
while ( scanner.hasNext() ){
for (int i=0; i<numberOfColumns; i++){
key = Int2String(i);
outMap.get(key).addElement(Double.parseDouble(scanner.next()));
}
}

} catch (FileNotFoundException ex) {
ex.printStackTrace();
}

return outMap;
}


String Int2String (int number) {
String outString = "";
Integer myInt = new Integer(number);
outString = myInt.toString();
return outString;
}

}
[/code]


Übrigens klappt das mit obigen Vorschlägen auch nicht.

Gruß
Migu
 

xehpuk

Top Contributor
Einen int wandelt man übrigens über
Code:
String.valueOf(int)
in einen String um. Allgemein brauchst du das nicht, da man Integer als Key verwenden kann. Das wiederum brauchst du hier gar nicht, da es hier schon eine Liste von Double-Arrays tut.

Probier es mal hiermit (ist jedoch ungetestet):
Java:
public List<double[]> readFile(final String fileName, final int numberOfColumns, final int headerRows) {
	final List<double[]> arrays = new ArrayList<double[]>();
	final File file = new File(fileName);
	try {
		final Scanner scanner = new Scanner(file).useDelimiter("\\s+");
		for (int i = 0; i < headerRows; i++) {
			scanner.nextLine();
		}
		while (scanner.hasNextLine()) {
			final double[] doubles = new double[numberOfColumns];
			for (int i = 0; i < numberOfColumns; i++) {
				doubles[i] = scanner.nextDouble();
			}
			arrays.add(doubles);
		}
	} catch (final FileNotFoundException ex) {
		ex.printStackTrace();
	}
	return arrays;
}
 

Migu

Mitglied
Einen int wandelt man übrigens über
Code:
String.valueOf(int)
in einen String um. Allgemein brauchst du das nicht, da man Integer als Key verwenden kann. Das wiederum brauchst du hier gar nicht, da es hier schon eine Liste von Double-Arrays tut.

Probier es mal hiermit (ist jedoch ungetestet):
Java:
public List<double[]> readFile(final String fileName, final int numberOfColumns, final int headerRows) {
	final List<double[]> arrays = new ArrayList<double[]>();
	final File file = new File(fileName);
	try {
		final Scanner scanner = new Scanner(file).useDelimiter("\\s+");
		for (int i = 0; i < headerRows; i++) {
			scanner.nextLine();
		}
		while (scanner.hasNextLine()) {
			final double[] doubles = new double[numberOfColumns];
			for (int i = 0; i < numberOfColumns; i++) {
				doubles[i] = scanner.nextDouble();
			}
			arrays.add(doubles);
		}
	} catch (final FileNotFoundException ex) {
		ex.printStackTrace();
	}
	return arrays;
}


Das funktioniert wenn man Zeile 12 umwandelt in
[JAVA=12]
doubles = Double.parseDouble(scanner.next());
[/code]

Mit funktionieren meine ich dass die datei richtig eingelesen wird.
Aber das Format ist irgendwie falsch... oder ich kann noch nicht mit eine List umgehen...
Wenn ich folgendes in der main-Funktion eingebe

Java:
funcs f = new funcs();
List<double[]> list = new ArrayList<>();
list = f.ReadFile("input.txt",2,2);

for (double d : liste.get(1)){
     System.out.println(d)
}

dann stehen da untereinander die Einträge der zweiten Zeile in der Datei.
Ich will aber auf die einzelnen Spalten zugreifen, nicht Zeilen!
 

Migu

Mitglied
Wie genau sieht denn so eine Txt-Datei aus die ausgelsen werden soll (ein Beispiel wäre gut)?

Es ist natürlich nur eine Beispieldatei. In wirklichkeit habe ich dann ein paar tausend Zeilen mit zB 10 Spalten.
So sieht die Inputdatei aus

das ist ein header
######################
1 2.56
2 10.52
3 4.58
4 1.53
5 0.745
6 0.85
7 9.456
8 24.5
9 1.12
10 4.23

Als Ergeniss bekomme ich anstatt der zweiten Spalte folgendes

 

Camill

Bekanntes Mitglied
Und nun soll die erste Spalte
Code:
1
2
3
4
5
6
7
8
9
10
über den Key "1" zu erreichen sein und die zweite Spalte
Code:
2.56
10.52
4.58
1.53
0.745
0.85
9.456
24.5
1.12
4.23
über den Key "2"?
 

Migu

Mitglied
Und nun soll die erste Spalte
Code:
1
2
3
4
5
6
7
8
9
10
über den Key "1" zu erreichen sein und die zweite Spalte
Code:
2.56
10.52
4.58
1.53
0.745
0.85
9.456
24.5
1.12
4.23
über den Key "2"?

Ja genau das!
Und es soll mir automatisch ein Objekt (List/Map) erstellen mit allen Spalten, je nachdem wieviele Spalten die Datei hat. Das übergibt man ja an der Funktion.
 

Camill

Bekanntes Mitglied
So, habe nun eine fertige Lösung erstellt:
Java:
public Map<Integer, Vector<Double>> readFile(final String fileName)
		throws NumberFormatException, IOException {

	Map<Integer, Vector<Double>> map = new HashMap<Integer, Vector<Double>>();
	BufferedReader reader = new BufferedReader(new FileReader(fileName));

	String line = null;
	while ((line = reader.readLine()) != null) {

		String[] temp = line.split(" ");
		for (int i = 0; i < temp.length; i++) {
			double d = Double.parseDouble(temp[i]);

			// put new Key with empty Vector into the map if Key not exist
			// already
			if (!map.containsKey(i)) {
				map.put(i, new Vector<Double>());
			}
			map.get(i).add(d);
		}
	}
	return map;
}

Exceptions wurden nicht berücksichtigt!
Der Header wird nicht mit einbezogen, was soll mit diesem passieren?
 

Migu

Mitglied
Ja! Jetzt klappt es, nach ein paar Änderugen.
Was Probleme verursacht hat war das in der "split" Funktion das Trennzeichen kein einfaches Leerzeichen sein darf, weil die Anzahl an leerzeichen zwischen den Spalten kann variieren.

So sieht es jetzt aus (müsste eigentlich auch genauso mit einem Scanner funktionieren)

Java:
    public Map<Integer, Vector<Double>> ReadFile(final String fileName, int headerRows){
 
        Map<Integer, Vector<Double>> map = new HashMap<>();
        try{
            BufferedReader reader = new BufferedReader(new FileReader(fileName));
           
            // Overread header
            for (int i=0; i<headerRows; i++) {reader.readLine();}        
           
            // Read file content
            String line = null;
            while ( reader.ready() == true ) {
                line = reader.readLine();
                String[] temp = line.split("\\s+");
                for (int i = 0; i < temp.length; i++) {
                    double d = Double.parseDouble(temp[i]);
                   
                    // put new Key with empty Vector into the map if Key not exist
                    // already
                    if ( map.containsKey(i) == false ) 
                    {
                        map.put(i, new Vector<Double>());
                    }
                    map.get(i).add(d);
                }
            }
            reader.close();
           
        } catch (NumberFormatException e){
            System.err.println("NumberFormatException:  " + e.getMessage());
        } catch (IOException io){
            System.err.println("IOException:  " + io.getMessage());
        }
        return map;
    }


Danke an Camill und an allen anderen!

Gruß
Migu
 

Camill

Bekanntes Mitglied
Gut, zum entfernen von Whitespace vor und hinter einem String kann auch
Code:
trim()
verwendet werden.
 

bERt0r

Top Contributor
Mit funktionieren meine ich dass die datei richtig eingelesen wird.
Aber das Format ist irgendwie falsch... oder ich kann noch nicht mit eine List umgehen...
Wenn ich folgendes in der main-Funktion eingebe

Java:
funcs f = new funcs();
List<double[]> list = new ArrayList<>();
list = f.ReadFile("input.txt",2,2);

for (double d : liste.get(1)){
     System.out.println(d)
}

dann stehen da untereinander die Einträge der zweiten Zeile in der Datei.
Ich will aber auf die einzelnen Spalten zugreifen, nicht Zeilen!

Schau dir den Code doch mal an, du gibst ja nur liste.get(1) aus. So iteriert man über eine ArrayList:
Java:
for(double[] array : liste)
{
System.out.println(Arrays.toString(array));
}
 

Migu

Mitglied
Ah ok, danke.
Wie gesagt, bin Anfänger/Umsteiger..... muss noch etwas Praxiserfahrung sammeln.

Aber eine Frage hätte ich doch noch:
Der Code oben liest ja ein Datei und speichert die Werte der Spalten in Vektoren als doubles.
Was ist aber wenn eine Spalte das Datum ist (zB 2011-10-01). Das kann man ja nicht als double einlesen.
Man kann aber Jahr, Monat und Tag als Integer/doubles einlesen wenn man das Trennzeichen auf - setzt

Meine Frage ist nun ob man in den Regular Expressions in

[JAVA=57]
Scanner scanner = new Scanner(file).useDelimiter("\\s+");
[/code]

sagen kann dass die ersten 2 "Delimiter" eben ein - und kein Leerzeichen sein sollen???
 

Camill

Bekanntes Mitglied
Eine Möglichkeit wäre mithilfe von
Code:
split("-")
String der bestimmten Spalte nochmals zu teilen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C "null" Element Vektor abfragen Java Basics - Anfänger-Themen 7
C Ein Element aus Mehrdimensionalem Vektor lesen Java Basics - Anfänger-Themen 2
B Vektor vs List Java Basics - Anfänger-Themen 4
L Klassen Vektor Klasse Java Basics - Anfänger-Themen 2
E Variable (Vektor) in andere Methode übergeben Java Basics - Anfänger-Themen 4
O Matrix, Vektor Java Basics - Anfänger-Themen 9
J Compiler-Fehler Fehler bei Vektor (E extends Object declared in class Vector) Java Basics - Anfänger-Themen 9
U Ist diese Methode zur Matrix Vektor Multiplikation korrekt ? Java Basics - Anfänger-Themen 5
S Variablen Vektor zur Berechnung verwenden Java Basics - Anfänger-Themen 4
E Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 7
M transposen Vektor transformieren Java Basics - Anfänger-Themen 8
M Vektor Rechnung Java Basics - Anfänger-Themen 6
B Stützstellen (Vektor) erzeugen? Java Basics - Anfänger-Themen 8
R Matrix-Vektor-Multiplikation Java Basics - Anfänger-Themen 13
B Vektor addieren Java Basics - Anfänger-Themen 4
F Funktion eines JButton in einen Vektor verlagern Java Basics - Anfänger-Themen 4
Z Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 13
P Vektor im R3 drehen? Java Basics - Anfänger-Themen 14
A vektor bearbeiten?? Java Basics - Anfänger-Themen 9
V Position in einem Vektor Java Basics - Anfänger-Themen 3
N Vektor mit eigener Datenstruktur sortieren Java Basics - Anfänger-Themen 20
A Wie greif ich auf Elemente eines Arrays in einem Vektor zu? Java Basics - Anfänger-Themen 6
D Array? ArrayList? Vektor? ...? Java Basics - Anfänger-Themen 6
C OOP Aus Vektor zufällig einen Eintrag wählen und in Array[][] schreiben Java Basics - Anfänger-Themen 5
Z Summe von Vektor-Elementen Java Basics - Anfänger-Themen 5
S Variable über den Vektor bestimmen Java Basics - Anfänger-Themen 20
J klasse vektor addition Java Basics - Anfänger-Themen 10
M Vektor Klasse Problem Java Basics - Anfänger-Themen 12
M Reihenfolge von Objekten im Vektor Java Basics - Anfänger-Themen 3
G Vektor auslesen und als int Variable casten Java Basics - Anfänger-Themen 4
G Mothoden von Objekten in Vektor aufrufen Java Basics - Anfänger-Themen 4
F ComboBox im Vektor auslesen, Vektor<JComboBox> Java Basics - Anfänger-Themen 6
G Probleme mit Datenstrukturen (Vektor, HashMap) Java Basics - Anfänger-Themen 5
T Koordinaten eines Vektor übergeben Java Basics - Anfänger-Themen 21
J Vektor in Vektor speichern? Java Basics - Anfänger-Themen 10
J Vektor null setzen Java Basics - Anfänger-Themen 10
R Vektor in verketteter Liste Java Basics - Anfänger-Themen 14
J Vektor + auf Elemente zugreifen funktioniert nicht Java Basics - Anfänger-Themen 11
H Vektor auslesen und durchsuchen Java Basics - Anfänger-Themen 4
G Vektor Java Basics - Anfänger-Themen 1
C vektor erschaffen Java Basics - Anfänger-Themen 2
L Vektor befüllen? Java Basics - Anfänger-Themen 3
G Doppelte (Paar) Werte in einem Vektor finden Java Basics - Anfänger-Themen 6
S kartesischer Vektor im n-dimensionalen Raum. Java Basics - Anfänger-Themen 7
G Objekte in einen Vektor speichern Java Basics - Anfänger-Themen 4
M Vektor, gefüllt mit Objekten einer selbstdefinierten Klasse Java Basics - Anfänger-Themen 4
C checken ob ein Vektor leer ist Java Basics - Anfänger-Themen 3
J tast-Eingabe_(Vektor)Skalar-produkt Java Basics - Anfänger-Themen 19
G elemente in einem vektor nach ihren eigenschaften sortieren Java Basics - Anfänger-Themen 2
G Problem clone und Vektor Java Basics - Anfänger-Themen 4
M Vektor sortieren Java Basics - Anfänger-Themen 7
P Vektor toString? Java Basics - Anfänger-Themen 2
T Hashtable und Vektor Java Basics - Anfänger-Themen 3
I einlaggern von Objekten in ein Vektor Java Basics - Anfänger-Themen 10
G Vektor Java Basics - Anfänger-Themen 3
K Wie kann ich ein Element an den Anfang setzten ? Java Basics - Anfänger-Themen 1
pc pc pc pc pc letztes Element eines Arrays n Java Basics - Anfänger-Themen 3
heinrich172 Methoden Trotz gleichem Element stimmt Vergleich nicht? Java Basics - Anfänger-Themen 7
I Element n aus Datenbank Query (JPA / Hibernate) Java Basics - Anfänger-Themen 3
A Jedes zweite Element eines Arrays entfernen Java Basics - Anfänger-Themen 30
O Doppelt verkette Liste Element löschen Java Basics - Anfänger-Themen 15
L Längstes Element einer ArrayList ausgeben Java Basics - Anfänger-Themen 9
I Letztes, erstes Element vom Array Java Basics - Anfänger-Themen 9
districon Element in Liste einfügen Java Basics - Anfänger-Themen 1
Y Wie kann ich ein Element in einer toString finden. Java Basics - Anfänger-Themen 2
J Element aus Liste nehmen Java Basics - Anfänger-Themen 3
S Gibt es ein simples JWebbrowser Element? Java Basics - Anfänger-Themen 6
M Letztes Element einer ArrayList Java Basics - Anfänger-Themen 12
S Streams - kleinstes Element finden Java Basics - Anfänger-Themen 4
V_Fynn03 Beliebiges Element in einer Liste löschen (Java)(Lineare Datenstrukturen) Java Basics - Anfänger-Themen 9
V_Fynn03 Lineare Datenstrukturen Element löschen? Java Basics - Anfänger-Themen 2
J Selektiertes Element von jComboBox zwischenspeichern und wieder einsetzen Java Basics - Anfänger-Themen 0
Curtis_MC Collections Zufälliges Element aus Stack Java Basics - Anfänger-Themen 2
M Ist es möglich, das größte und zweitgrößte element in einem Array mit nur einer Schleife ausfindig zu machen ? Java Basics - Anfänger-Themen 19
X Array erstes und letztes Element tauschen Java Basics - Anfänger-Themen 2
A Konsolenausgabe: Hinter letztes Element ein "}" Java Basics - Anfänger-Themen 2
F nur das erste Element mit iterator ausgeben Java Basics - Anfänger-Themen 5
O Element aus Array löschen Java Basics - Anfänger-Themen 5
I Methoden List.contains() beim 2. Element = true Java Basics - Anfänger-Themen 1
M Array immer wieder um ein Element erweitern Java Basics - Anfänger-Themen 6
AnnaBauer21 org.w3c.dom.Element - Neues Element hinzufügen Java Basics - Anfänger-Themen 4
D doc.seect jsouo bestimmtes class element finden Java Basics - Anfänger-Themen 1
D Selenium Webdrive get x Element Java Basics - Anfänger-Themen 14
W Element aus HashSet in String umformen Java Basics - Anfänger-Themen 7
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
B Element in Array nach unten verschieben Java Basics - Anfänger-Themen 11
TechGirl JAVA GUI Oberfläche Umkreisung - wie heißt dieses Element? Java Basics - Anfänger-Themen 2
B Methoden Element aus einem Array löschen, Rest nach vorne verschieben? Java Basics - Anfänger-Themen 4
Z Html Element aus der Webseite auslesen Java Basics - Anfänger-Themen 1
A Hash Tabelle Element suchen Java Basics - Anfänger-Themen 1
K Collections Zugriff auf ein bestimmtes Element in der Collection Java Basics - Anfänger-Themen 1
K Element in ArrayList löschen ohne Index zu verschieben Java Basics - Anfänger-Themen 2
J Variablen Strings mit Zeilenumbrüchen in neues Array Element Java Basics - Anfänger-Themen 1
W Größtes Element im unsortierten Binärbaum Java Basics - Anfänger-Themen 7
S Günstigstes Element aus einer ArrayList ausgeben Java Basics - Anfänger-Themen 10
N ArrayList: Das zweite Element wird zur Liste nicht eingefügt nach dem zweiten request. Java Basics - Anfänger-Themen 3
Ruvok Prüfen ob bestimmtest Element existiert im Array Java Basics - Anfänger-Themen 11
A ResultSet: vorheriges Element auslesen Java Basics - Anfänger-Themen 10
F Element aus LinkedList löschen Java Basics - Anfänger-Themen 3
J Element zu jList hinzufügen NullPointerExcepetion Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben