2016-12-02 2 views
0

Я сейчас застрял в попытке выяснить, почему мои значения массива не отображаются в диалоговом окне. Я выполняю задание, чьи данные:Как показать JOptionPane через пользовательский ввод

«Записать программу с именем TallestBuildingLookupthat содержит массив из 10 объектов TallestBuilding и заполнить его соответствующими данными. Затем используйте диалоговые окна, чтобы принять имя здания и отобразить местоположение здания , высота и истории. Если совпадение не найдено, отобразите сообщение об ошибке с недопустимым именем и разрешите пользователю искать новое имя здания ».

Моя основная проблема заключается в том, что мои значения массива отображаются из моего метода toString() и обрабатывают исключение, когда я не получаю имя в массиве. В частности, получение диалогового окна для циклического повторного ввода значения имени и повторного проверки массива. Любая помощь будет принята с благодарностью.

import javax.swing.*; 

public class TallestBuildingLookup { 

    static class TallestBuilding{ 
     private String name; 
     private String city; 
     private int height; 
     private int stories; 

     public TallestBuilding(String name, String city, int height, int stories)  { 
      this.name = name; 
      this.city = city; 
      this.height = height; 
      this.stories = stories; 
     } 

     public String getName(){ 
      return this.name; 
     } 
     public String toString(){ 
      return this.name + " of " + this.city + ", "+ this.stories + "stories/" + this.height + " feet high." ;  
     } 
    } 
    public static void main(String[] args){ 
     TallestBuilding[] tallestbuilding = new TallestBuilding[10]; 
     tallestbuilding[0] = new TallestBuilding("One World Trade Center", "New York", 1776, 104); 
     tallestbuilding[1] = new TallestBuilding("Willis Tower", "Chicago", 1451, 108); 
     tallestbuilding[2] = new TallestBuilding("Empire State", "New York", 1250, 102); 
     tallestbuilding[3] = new TallestBuilding("Bank of America Tower", "New York", 1200, 55); 
     tallestbuilding[4] = new TallestBuilding("Aon Center", "Chicago", 1136, 83); 
     tallestbuilding[5] = new TallestBuilding("John Hancock Center", "Chicago", 1127, 100); 
     tallestbuilding[6] = new TallestBuilding("Wells Fargo Plaza", "Houston", 992,71); 
     tallestbuilding[7] = new TallestBuilding("Comcast Center", "Philidelphia", 974, 57); 
     tallestbuilding[8] = new TallestBuilding("Columbia Center", "Seattle", 967, 76); 
     tallestbuilding[9] = new TallestBuilding("Key Tower", "Clevland", 947, 57); 

     String entry = JOptionPane.showInputDialog("Enter a builing name"); 
     String name = (String) entry; 

     System.out.println(name); 

     for (int i=0; i<10; i++){ 
      if(name == tallestbuilding[i].getName()){ 
       JOptionPane.showInputDialog(null, tallestbuilding[i]); 
      } 
      else{ 
       JOptionPane.showInputDialog("Sorry - no "+ name + " was found."); 
      } 
     } 
    } 
} 
+0

Проверьте мой ответ, посмотрите, подходит ли он вам! – BrunoDM

ответ

1

Попробуйте это:

TallestBuilding tallestBuilding = null; 
for (int i=0; i<10; i++){ 
    if(name.equals(tallestbuilding[i].getName())){ 
     tallestBuilding = tallestbuilding[i]; 
     break; 
    } 
} 
if(tallestBuilding == null) { 
    JOptionPane.showInputDialog("Sorry - no "+ name + " was found."); 
} else { 
    JOptionPane.showMessageDialog(null, tallestBuilding); 
} 
  1. не использовать '==' для сравнения строк, потому что он сравнивает ссылку, а не значение его собственного. Проверьте Java String.equals versus ==
  2. Используйте MessageDialog, чтобы показать пользователю значение, а не InputDialog
  3. Вы должны разорвать для цикла после показа пользователя
  4. Вы должны сохранить найденный объект в качестве ссылки темпа, чтобы отобразить его после ,
+0

Спасибо! Мне нужно было сравнить строки с использованием метода .equals(). –

+1

Я пропустил ошибку '==' в своем ответе. 1+ по голосу. @TylerHamlin: не забудьте проголосовать и, возможно, принять этот ответ. –

0

В частности, получить диалоговое окно для цикла, чтобы повторно ввести значение имени и перепроверить массив.

Ну, вам нужно задать для ввода в цикле некоторого типа, то, что вы не делаете в вашем коде. Существует два основных стиля цикла: для цикла, который используется, когда вы знаете заранее, сколько раз вы хотите петли (здесь вы этого не делаете), - и a while loop или do-while петля, когда вы не знаете заранее. Я предлагаю вам использовать цикл do-while, так как вы хотите получить вход от пользователя хотя бы один раз, то есть цикл должен запускаться хотя бы один раз, если не больше, а затем продолжать цикл до тех пор, пока вход не будет действителен. Я бы использовал логическое значение, например, под названием boolean inputValid = false;.

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

Моя основная проблема заключается в получении значений массива для отображения из моего метода toString() и обработки исключения, когда я не получаю имя в массиве.

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