2015-11-09 2 views
0

Я пытался создать тип лабиринта, читая его из файла конфигурации с помощью HashMaps, чтобы различать атрибут Room и атрибут двери. Если я просто печатаю значения String [], они печатают соответствующие значения конфигурации, однако, когда я пытаюсь распечатать значения с помощью HashMap, вызывая его по его ключу, он сообщает мне, что значения равны нулю. Любые советы?Значения String Array и HashMaps

Мой код:

 while (file.hasNextLine()) { 
      String line = file.nextLine(); 
      if (line.isEmpty()) { 
       continue; 
      } 
      Scanner scanner = new Scanner(line); 
      String type = scanner.hasNext() ? scanner.next() : ""; 

      String name = scanner.hasNext() ? scanner.next() : ""; 

      String wall1 = scanner.hasNext() ? scanner.next() : ""; 

      String wall2 = scanner.hasNext() ? scanner.next() : ""; 

      String wall3 = scanner.hasNext() ? scanner.next() : ""; 

      String wall4 = scanner.hasNext() ? scanner.next() : ""; 

      HashMap<String,String[]> roomSite = new HashMap<String, String[]>(); 
      HashMap<String,String[]> doorSite = new HashMap<String, String[]>(); 

      String[] options = new String[]{wall1,wall2,wall3,wall4}; 

      if(type.equals("room")){ 
       roomSite.put(name, options); 
      }else if(type.equals("door")){ 
       doorSite.put(name, options); 
      }else{ 
       System.out.println("Error in config file. Please check that all options are valid."); 
      } 
      System.out.println(roomSite.get(0)); 
      System.out.println(doorSite.get("d0")); 
    } 

Выход:

config.ini

room 0 wall d0 wall wall 
room 1 d0 wall d1 wall 
room 2 wall wall wall d1 
door d0 0 1 close 
door d1 1 2 open 
+2

Ну, у вас есть '0' в качестве ключа в '' roomSite' или «d0» 'как ключ' doorSite' на итерациях, когда она печатает 'null'? –

+2

Это может иметь смысл, если вы используете ['String.split()'] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split (java.lang .String)) на вашей линии, а не на всех этих сканерах. –

ответ

1

Вы System.out.println(roomSite.get(0));, когда он должен быть System.out.println(roomSite.get("0"));

Ваша карта s от String до String[], а не Integer до String[].

Кроме того, если вы хотите получить более значимую инструкцию печати вместо [Ljava.lang.String;@e9e54c2, вы можете использовать метод Arrays.toString().

+0

Привет, после создания ключа «0», теперь он дает мне: [Ljava.lang.String; @ e9e54c2, за которым следуют нули, это нормально? – adventuredoge

+1

Вы должны инициализировать свои карты, прежде чем начать чтение из своего файла. Каждый раз, когда вы читаете строку, вы создаете новую «HashMap». Итак, на первой итерации, когда вы читаете в комнате 0, вы добавляете свои данные на карту, поэтому вы видите напечатанную '[Ljava.lang.String; @ e9e54c2'. Затем вы создаете новые карты и добавляете другие комнаты/двери. Детали «0» не находятся на новых картах, поэтому вы видите только «нуль» на последующих итерациях. –

+0

Ооооо, хорошо. Он работает сейчас. Большое спасибо за помощь! Я застрял на этом как 2 часа сейчас :) – adventuredoge

1

Инициализируйте свой HashMaps перед повторением через ваш файл. Попробуйте что-то вроде этого:

public static void main(String []argh) throws FileNotFoundException 
{ 
    Scanner scan = new Scanner(new File("config.ini")); 
    HashMap<String, String[]> roomSite = new HashMap<>(); 
    HashMap<String, String[]> doorSite = new HashMap<>(); 
    while(scan.hasNext()){ 
     String type = scan.next(); 
     String name = scan.next(); 
     String[] walls = scan.nextLine().trim().split(" "); 
     switch(type){ 
     case "room": 
      roomSite.put(name, walls); 
      break; 
     case "door": 
      doorSite.put(name, walls); 
      break; 
     default: 
      System.out.println("Error in config file. Please check that all options are valid."); 
     } 
    } 
    System.out.println(Arrays.toString(roomSite.get("0"))); 
    System.out.println(Arrays.toString(doorSite.get("d0"))); 
} 
Смежные вопросы