2014-11-14 6 views
1

Я пытаюсь получить HashMap хранить строку и ArrayList<String>. Основном то, что я хочу для первой строки должно быть имя, а ArrayList содержит все страны, пользователь уже был.HashMap <String, ArrayList <String>>

Example: 
{Andrew, [USA, China]} 
{Lola, [Sweden, Denmark]} 

Проблема встречаю это всякий раз, когда пользователь вводит в стране, страна будет храниться под обоими названиями:

"The HashMap contains: {Andrew=[USA, China, Sweden, Denmark], Lola=[USA, China, Sweden, Denmark]}" 

ArrayList<String> namelist = new ArrayList<>(); 
ArrayList<String> test = new ArrayList<>(); 
ArrayList<String> archive = new ArrayList<>(); 
HashMap<String, ArrayList<String>> thearchive = new HashMap<>(); 

(input.equals("New Country")){ 
    System.out.println("Name of the Person? "); 
    String name = in.nextLine(); 
    if(namelist.contains(name)){ 
     System.out.println("Which Country have you visited?"); 
     String country = in.nextLine(); 
     if (archive.contains(country)){ 
      System.out.println("You've already visited this country."); 
     } 
     else { 
      test.add(country); 
      thearchive.put(name, country); 
      System.out.println("HashMap Contains: " + thearchive); 
     } 
    } 
    else{ 
     System.out.println("The person does not exist please add first."); 
    } 

ли кто-нибудь знает, почему HashMap не хранит ключ/значения по Кстати, я тоже хочу?

+1

Необходимо предоставить остальную часть кода. – archie

ответ

1

Обычно ваша проблема связана с повторным использованием одного и того же массива ArrayList для всех людей, так что все люди имеют одни и те же страны, все из которых принадлежат одному одному ArrayList. Решение состоит в том, чтобы создать новый ArrayList для каждого человека, то есть new ArrayList<String> должен находиться внутри некоторого цикла, где вы создаете имя своего путешественника String.

Так, например, вы можете изменить свой код на этот:

ArrayList<String> namelist = new ArrayList<>(); 
ArrayList<String> test = new ArrayList<>(); 

// ArrayList<String> archive = new ArrayList<>(); 

HashMap<String, ArrayList<String>> arkivet = new HashMap<>(); 

(input.equals("New Country")){ 
    System.out.println("Name of the Person? "); 
    String name = in.nextLine(); 

    archive = ArrayList<String>(); // ********** 
    arkivet.put(name, archive); // ************ 

    if(namelist.contains(name)){ 
     System.out.println("Which Country have you visited?"); 
     String country = in.nextLine(); 
     if (archive.contains(country)){ 
      System.out.println("You've already visited this country."); 
     } 
     else { 
      test.add(country); 
      thearchive.put(name, country); 
      System.out.println("HashMap Contains: " + thearchive); 
     } 
    } 
    else{ 
     System.out.println("The person does not exist please add first."); 
    } 
+0

Спасибо, попробуем код, чтобы увидеть, где он меня достает :) – Hablo

+0

Что делают эти две строки кода? "archive = = ArrayList (); // **********", "arkivet.put (имя, архив); // ************" Потому что я просто получите незаконное начало выражения при запуске программы на этих строках – Hablo

+0

@Hablo: typo. Это происходит из-за того, что я работаю с фрагментами кода, которые я не могу скомпилировать, поэтому я не могу сообщить компилятору, когда мои толстые пальцы ладят. –

0

Ваш код Nota завершен, так что я не могу знать, что тестировать thearchive. Но давайте создадим пример:

HashMap<String, ArrayList<String>> list = new HashMap<String, ArrayList<String>>(); 
ArrayList<String> anotherlist = new ArrayList<String>(); 
anotherlist.add("Brazil"); 
anotherlist.add("USA"); 
list.put("Augusto", anotherlist); 

Надеюсь, это поможет.

+0

Проблема в том, что мне нужно взять имя и страны от пользователя через System.in. – Hablo

Смежные вопросы