2015-07-08 3 views
1

В основном я знаю, как это сделать с помощью ArrayList, но для этого с Array я полностью в тупике.Попытка добавления массива строк через другой класс с использованием HashMap

import java.util.HashMap; 
import java.util.Set; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Collection; 

public class NobelPrizeWinners 
{ 
    private HashMap<String, PrizeWinners[]> winners; 

    public NobelPrizeWinners() 
    { 
     winners = new HashMap<String, PrizeWinners[]>(); 

     PrizeWinners[] name = new PrizeWinners[3]; 
     name[0] = new PrizeWinners("hey" , "Hey"); 

     winners.put("2008", name); 
    } 
} 
public void displayAllYearsAndWinners(){ 
    Set<String> years = winners.keySet(); 

      for(String year : years){ 
       PrizeWinners [] list = winners.get(year); 
       for(PrizeWinners[] names : list){ 

       System.out.println(year + " " + names); 
      } 

     } 

    } 

Это возвращает только адрес памяти не фактический Strings (Класс призёров имеет два строковых параметры в конструкторе, а также два метода, установленных для имени и фамилии)

Я чувствую, что я» m довольно близко, поскольку он возвращает «2008» три раза, но только адрес памяти или нуль других трех раз (так как я еще не добавил другие 2 массива, но все еще тестировал, чтобы убедиться, что он работает)

Любая помощь будет будем очень благодарны, я чувствую, что это имя или метод, который мне нужно назвать, что я не уверен.

+0

Когда то, что возвращает? Где ваше заявление 'return'? – mittmemo

+0

У меня есть отдельный метод, который печатает имя в середине по два для каждого цикла, поэтому я думаю, что он фактически не возвращает столько же, сколько печатает через System.out.println, и когда он печатает его, он печатает адрес памяти. – Jordan

+0

Вы также должны включить этот метод. – mittmemo

ответ

1

Первый вопрос заключается в том, что цикл должен быть следующим:

for (String year: years) { 
    PrizeWinners[] list = winners.get(year); 
    for (PrizeWinners names: list) { 
     System.out.println(year + " " + names); 
    } 
} 

Поскольку вы уже получить list как массив, ваш обмен на каждый цикл возвращает PrizeWinners каждой итерации, а не другой массив.

Эта линия:

System.out.println(year + " " + names); 

эквивалентно следующим образом:

System.out.println(year.toString() + " " + names.toString()); 

Поскольку year является String, его метод toString() просто возвращает его значение, как и ожидалось.

Но names является Array. Его метод toString() непосредственно унаследован от Object и печатает адрес памяти names.

Самый чистый способ решить эту проблему - переопределить toString() в классе PrizeWinners. Это позволяет вам самим решить, что должно выглядеть представление вашего класса String.

public String toString() { 
    return this.firstName + ", " + this.lastName; 
} 

Теперь, когда неявное toString() вызывается на names экземпляра PrizeWinners, вы получите ваш ожидаемый результат.

+0

. Я получаю сообщение о несовместимых типах: PrizeWinners не может быть преобразован в PrizeWinners [] его отображающий список в качестве причины, по которой – Jordan

+0

. Желаемый вывод должен был отображать год и имя и фамилия. – Jordan

+0

Странно, что он на самом деле скомпилировал бы и позволил бы мне распечатать адрес памяти, и теперь это даже не будет, когда я верну его оригинальному пути, я написал его – Jordan

1
 for(String year : years){ 
     PrizeWinners [] list = winners.get(year); 
     for(PrizeWinners winnerName: list){ 
       System.out.println(year + " " + winnerName.firstName + " " + winnerName.lastName); 

     } 

    } 
+0

Я получаю PrizeWinners не могут быть преобразованы в PrizeWinners [] – Jordan

1

У вас есть некоторые странные вещи, которые происходят в вашем методе displayAllYearsAndWinners. Это может быть упрощено только это:

NobelPrizeWinners.java

import java.util.Arrays; 
import java.util.HashMap; 
import java.util.Map; 

public class NobelPrizeWinners { 
    private Map<String, PrizeWinner[]> yearToWinners; 

    public NobelPrizeWinners() { 
    yearToWinners = new HashMap<String, PrizeWinner[]>(); 

    PrizeWinner[] winners2008 = new PrizeWinner[3]; 
    winners2008[0] = new PrizeWinner("hey", "Hey"); 
    yearToWinners.put("2008", winners2008); 
    } 

    public void displayAllYearsAndWinners() { 
    for (Map.Entry<String, PrizeWinner[]> entry : yearToWinners.entrySet()) { 
     System.out.printf("%s %s%n", entry.getKey(), Arrays.toString(entry.getValue())); 
    } 
    } 
} 

PrizeWinners Вашего класс должен, вероятно, не будет множественным числом, если каждый объект представляет собой один победитель. Вы используете массив PrizeWinner для представления нескольких победителей приза.

Обратите внимание, что toString переопределяется.

PrizeWinner.Java

public class PrizeWinner { 
    private String first; 
    private String last; 

    public PrizeWinner(String first, String last) { 
    this.first = first; 
    this.last = last; 
    } 

    @Override 
    public String toString() { 
    return String.format("%s %s", first, last); 
    } 
} 

Выход

2008 [hey Hey, null, null] 
0
public void displayAllYearsAndWinners(){ 
    Set<String> years = winners.keySet(); 
      for(String year : years){ 
       PrizeWinners [] list = winners.get(year); 
       for(PrizeWinners prizeWinners : list){ 
        System.out.println(year + " " + prizeWinners.first+" "+ prizeWinners.last); 
      } 
     } 
    } 
Смежные вопросы