2016-04-07 6 views
0

Sorry, wenn der Titel nicht klar ist, bin ich nicht sehr gut mit Programmiersprache.Warum kann ich einer lokal deklarierten ArrayList <Integer> keine eingebettete ArrayList <Integer> zuweisen?

Ich habe 2 string Arraylisten und eine ganze Zahl Arraylist von einem Verfahren erhalten, das zu einem getrennten Verfahren durch die Sammlung LinkedHashMap < String, List < String >> geben wird. Allerdings, wenn ich versuchen, die ganze Zahl Arraylist in eine leere Arraylist in der Empfangs Methode deklariert zu setzen, es zeigt die Syntaxfehler: „inkompatible Typen: Liste < String> kann nicht auf Liste < Integer> umgewandelt werden“.

Starter Methode:

public static void main(String[] args) { 

    try{ 

    LinkedHashMap lhm = new LinkedHashMap(); 
    List<String> listEPC = new ArrayList<String>(); 
    List<String> listTimeStamp = new ArrayList<String>(); 
    List<Integer> listAntenna = new ArrayList<Integer>(); 

    String tagID = "EQ5237"; 
    String TimeStampStr = "12:23:22"; 
    int tagAntenna = 2;   

      listEPC.add(tagID); 
      listTimeStamp.add(TimeStampStr); 
      listAntenna.add(tagAntenna); 

      lhm.put("epcs", listEPC); 
      lhm.put("timestamps", listTimeStamp); 
      lhm.put("antennas", listAntenna); 

    insertData insert = new insertData(); 
    insert.insertData(lhm);     //send map with values to new method 

    }catch(Exception e){ 
    e.printStackTrace(); 
    } 
} 

Empfangen Methode:

public class insertData { 

    public void insertData(LinkedHashMap<String, List<String>> readMap) { 

      List<String> listEPC = new ArrayList<String>(); 
      List<String> listTimeStamp = new ArrayList<String>(); 
      List<Integer> listAntenna = new ArrayList<Integer>(); 

      String EPC = null; 
      String TimeStamp = null; 
      Integer Antenna = null; 

      listEPC = readMap.get("epcs"); 
      listTimeStamp = readMap.get("timestamps"); 
      listAntenna = readMap.get("antennas");  //error message here 

      for(int i=0; i<readMap.size(); i++){ 

       EPC = listEPC.get(i); 
       TimeStamp = listTimeStamp.get(i); 
       Antenna = listAntenna.get(i); 

       System.out.println("Entry " + i); 
       System.out.println("Values: " + EPC + TimeStamp + Antenna); 
      } 
      } 
} 

Dieser Code funktioniert nur, wenn ich alle Instanzen von ganzen Zahlen in Strings ändern, das ist nicht das, was ich in meinem eigentlichen Code möchte. Warum ist das so und wie arbeite ich daran?

+0

Weil Ihre LinkedHashMap Liste enthält nicht Liste. Du wirst wirken müssen. – matt

+0

Möchten Sie über 'readMap.size()' iterieren? Das ist nicht die gleiche Länge wie Ihre Listen in der Karte. – matt

+0

@matt "Du wirst spielen müssen" Klingt für mich nicht typsicher. –

Antwort

3

Sie kein List<String> zu einem List<Integer> zuweisen können. Die Elemente sind grundsätzlich verschiedene Arten.

Sie müssten ein neues List konstruieren:

List<Integer> listOfIntegers = new ArrayList<>(); 
for (String entry : listOfStrings) { 
    listOfIntegers.add(Integer.valueOf(entry); 
} 

Natürlich müssen Sie auch die Möglichkeit, zu handhaben, dass Elemente der Liste nicht als ganze Zahlen analysiert werden kann.


Sie werfen jedoch nur Typinformationen weg, indem Sie alles in eine einzige Karte stopfen. Es wäre besser, die drei Listen separat weitergeben müssen:

insertData(listEPC, listTimestamp, listAntenna); 

und dann können Sie verschiedene Listentypen in der Methodensignatur haben:

void insertData(
    List<String> listEPC, 
    List<String> listTimestamp, 
    List<Integer> listAntenna) { ... } 
+0

Wenn Sie sich ansehen, wie das OP seine Map erstellt hat, löst Ihre Top-Lösung eine Exception aus, weil eine ihrer Listen tatsächlich eine 'List ' – matt

+0

@matt yep ist. Ich habe oben die Verwendung von Rohtypen kommentiert. –

+0

Danke! Ich hatte den Eindruck, dass die einzige Möglichkeit, mehrere Wertegruppen zu vermitteln, eine Sammlung war. Diese Methode ist eine viel einfachere Lösung. – Lagostax

1

Ich werde die richtige Antwort auf dem Boden schließen, aber in Bezug auf Ihre Frage Titel, werden Sie Ihre Methodensignatur ändern müssen:

LinkedHashmap<String, List<?>> readMap; 

dann entweder warf die Listen, die eine unsichere Besetzung verursachen. z.B.

List<String> listEPC = (List<String>)readMap.get("epcs"); 

Oder werfen Sie das Objekt.

List<?> listEPC = readMap.get("epcs"); 

Dann in der Schleife gegossen.

EPC = (String)listEPC.get(i); 

Hinweis, diese sind nicht gute Lösungen.

Was Sie haben sollten, ist eine Liste, die ein Objekt mit allen Daten enthält, die Sie benötigen.

Ich kann mir vorstellen, dass der Denkprozess etwas in diese Richtung ging, "Ich habe diese Dinge, und sie enthalten zwei Strings und eine ganze Zahl. Ich werde für jede eine Variable erstellen." Dann stellst du die Frage: "Wie erstelle ich eine Sammlung dieser Dinge?"

Die falsche Antwort auf diese Frage lautet: "Ich werde eine Liste für jeden Wert erstellen und zugehörige Werte nach Index abgleichen." Die richtige Antwort lautet: "Ich werde eine Klasse erstellen, um meine Daten zu repräsentieren und diese in einer Liste zu speichern." Dies ist die grundlegende Essenz der Objektorien Programmierung (Willkommen in Java).

Zuerst haben wir die Klasse Design:

class EPCThing{ 
    String EPC; 
    String timeStamp; 
    int Antennas; 

    public EPCThing(String tagId, String timeStamp, int antennas){ 
     EPC=tagId; 
     this.timeStamp = timeStamp; 
     Antennas = antennas; 
    } 

    @Override 
    public String toString(){ 
     return "Values: " + EPC + TimeStamp + Antenna 
    } 

} 

Jetzt wichtigste Methode des Programms wird so etwas wie sein.

List<EPCThing> things = new ArrayList<>(); 

String tagID = "EQ5237"; 
String TimeStampStr = "12:23:22"; 
int tagAntenna = 2;   

EPCThing thing = new EPCThing(tagID, TimeStampStr, tagAntenna); 
things.add(thing); 

insertData insert = new insertData(); 
insert.insertData(things); 

Dann können wir Ihre beheben insert Methode

public void insertData(List<EPCThing> things) { 

    for(int i=0; i<things.size(); i++){ 

      System.out.println("Entry " + i); 
      System.out.println("Values: " + things.get(i)); 

    } 
} 
+0

Das grundlegende Problem hier ist, dass die Karte nur Strings enthält, die Listen von Strings zugeordnet sind, aber OP möchte eine Liste von 'Integer' abrufen. Casting bringt hier nichts, außer dass der Fehler von Compile auf Runtime verschoben wird. – Paul

+0

@Paul, wo das OP die Karte erstellt, fügt er eine Liste ein. – matt

+0

sry, verpasst das. Dieser Code ist ziemlich schlecht entworfen – Paul

Verwandte Themen