2015-11-22 3 views
0

Я делаю игру, в которой пользователь вводит свое имя и фамилию. Программа извлекает первые буквы из имен, а затем выводит имена из массива строк.Извлечение из массива строк в Java

Я думаю, что проблема находится в последней части кода, где я сравниваю первый ряд строк и lastLetter с массивом. Но я не уверен. Я потратил некоторое время на исследования, и я застрял.

Любые комментарии приветствуются. Вы не будете обижать мои чувства.

import java.util.Arrays; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Scanner; 

public abstract class ChristmasName extends JFrame implements ActionListener { 


public static void main(String[] args) { 

    JFrame frame = new JFrame("What is your Christmas Name?"); 
    frame.setVisible(true); 
    frame.setSize(400,300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JPanel panel = new JPanel(); 
    frame.add(panel); 

    JLabel firstName = new JLabel("First name:"); 
     JTextField first = new JTextField(15); 
    JLabel lastName = new JLabel("Last name:"); 
     JTextField last = new JTextField(15); 
    panel.add(firstName); 
    panel.add(first); 
    panel.add(lastName); 
    panel.add(last); 

    JButton submit = new JButton("Submit"); 
    panel.add(submit); 
    submit.addActionListener(new ActionListener() { 

     @Override 
     public actionPerformed(ActionEvent e) { 
      String[] first_name = {"Apple","Eggnogg","Candy","Jingle","Holly","Goldie","Ho Ho","Frosty","Joyous","Mittens","Tinsel","Turkey","Tiny","Cranberry","Bloated","Angel","Bauble","Bulb","Ginger","Blitzen","Eve","Faith","Fruitcake","Goose","Glitter","Grinch"}; 
      String[] last_name = {"Tidings","Swan","Jolly","Claus","Mistletoe","Punch","Chimney","Coal","Igloo","Jumper","Myrhh","Pudding","Reindeer","Rejoice","Icicle","Midnight","Shepherd","Surprise","Gift","Magi","Train","Tree","White","Donkey","Wreath","Stuffing"}; 

      String firstLetter = first.getText(); 
      firstLetter = firstLetter.substring(0,1); 

      String lastLetter = last.getText(); 
      lastLetter = lastLetter.substring(0,1); 

      if (firstLetter == "A") { 
       firstLetter = first_name[0]; 

      } 



      JOptionPane.showMessageDialog(null, firstLetter + " " + lastLetter); 
      System.exit(0);  
     } 
    });  

} 

}

+0

Что именно не так? Какие материалы вы предоставляете, каков результат и каков ожидаемый результат? – DBug

+0

Либо используйте 'char', либо сравните строки правильно. –

+1

Сравните String с equals() not == – dragon66

ответ

1

Вот мое решение для вашей проблемы:

String[] first_names = {"Apple","Eggnogg","Candy","Jingle","Holly","Goldie","Ho Ho","Frosty","Joyous","Mittens","Tinsel","Turkey","Tiny","Cranberry","Bloated","Angel","Bauble","Bulb","Ginger","Blitzen","Eve","Faith","Fruitcake","Goose","Glitter","Grinch"}; 
String[] last_names = {"Tidings","Swan","Jolly","Claus","Mistletoe","Punch","Chimney","Coal","Igloo","Jumper","Myrhh","Pudding","Reindeer","Rejoice","Icicle","Midnight","Shepherd","Surprise","Gift","Magi","Train","Tree","White","Donkey","Wreath","Stuffing"}; 

// User Input: 
// Note: converted to lower case so the chars can be compared easily. 
String firstName = first.getText().toLowerCase(); 
String lastName = last.getText().toLowerCase(); 

// Vars for output: 
String sChristmasFirstName = null; 
String sChristmasLastName = null; 

// Do first name (if entered) 
if(firstName.length() > 0){ 
    // Loop all names to find the match: 
    for(String name : first_names){ 
     if(name.toLower().charAt(0) == firstName.charAt(0)){ 
      // We found a Christmas first name for the user 
      sChristmasFirstName = name; 
      // we can now exit the loop 
      break; 
     } 

    } 
} // else, the user left this field blank 

// Do same thing for last name 
if(firstName.length() > 0){ 
    // Loop all names to find the match: 
    for(String name : last_names){ 
     if(name.toLower().charAt(0) == lastName.charAt(0)){ 
      // We found a Christmas last name for the user 
      sChristmasLastName = name; 
      // we can now exit the loop 
      break; 
     } 

    } 
} // else, the user left this field blank 

// Prepare output string: 
String output = ""; 
String outputErrorPortion = ""; 
if(sChristmasFirstName != null){ 
    output += sChristmasFirstName; 
}else{ 
    if(firstName.length() == 0){ 
     outputErrorPortion += "It looks like you didn't enter a first name."; 
    }else{ 
     // Could not find an applicable first name 
     output += firstName; 
     ouputErrorPortion += "It looks like we couldn't find a Christmas first name for you :-("; 
    } 
} 

if(sChristmasLastName != null){ 
    output += " " + sChristmasLastName; 
}else{ 
    if(lastName.length() == 0){ 
     outputErrorPortion += " It looks like you didn't enter a last name."; 
    }else{ 
     // Could not find an applicable last name 
     output += " " + lastName; 
     ouputErrorPortion += " It looks like we couldn't find a Christmas last name for you :-("; 
    } 
} 

// trim leading and trailing spaces if there are any: 
output = output.trim(); 
outputErrorPortion = outputErrorPortion.trim(); 

// Variable 'output' now contains the Christmas first name, last name, both, or neither. 
// Error message now contains a descriptive error about what happened (if anything) 

Струнные сравнения выбрать рождественские имена встречаются в a для каждого цикла, который петли над first_names и last_names Строковые массивы, чтобы найти первое совпадение, которое начинается с той же буквы, что и введенные пользователем имена и фамилии. Рождественские имена затем конкатенируются в конце переменной output с введенными пользователем именами и/или фамилиями, которые используются вместо рождественского эквивалента, если соответствующая запись не может быть найдена в массивах имен Рождества. Сообщение об ошибке также создается в переменной outputErrorPortion, если при обработке имен возникли ошибки.

+0

Это действительно круто. Спасибо. – JennyJ

1

Не уверен, что вы просите, но первая проблема, которую я вижу в вашем коде:

если (firstLetter == "A") { firstLetter = first_name [0];

}

Смотрите следующее о том, как проверить, если две строки имеют одинаковое значение: How do I compare strings in Java?

+0

Спасибо за ссылку. – JennyJ

1

Потому что вам нужно только один символ, вы должны использовать charAt() вместо substring. Хотя возможно substring, я всегда забываю, какой параметр является инклюзивным или эксклюзивным. Думаю, ты тоже.

Вы должны объявить 2 символов:

char firstChar = first.getText().charAt(0); 
char lastChar = last.getText().charAt (0); 

И тогда вы можете проверить их:

if (firstChar == 'A') { //Remember to use single quotes! 
+0

Благодарим вас за напоминание о одиночных кавычках! – JennyJ

0

Вот код, который нужно внимательно прочитать:

  String[] firstNames = { "Apple", "Eggnogg", "Candy", "Jingle", "Holly", "Goldie", "Ho Ho", "Frosty","Joyous", "Mittens", "Tinsel", "Turkey", "Tiny", "Cranberry", "Bloated", "Angel", "Bauble","Bulb", "Ginger", "Blitzen", "Eve", "Faith", "Fruitcake", "Goose", "Glitter", "Grinch" }; 
      String[] lastNames = { "Tidings", "Swan", "Jolly", "Claus", "Mistletoe", "Punch", "Chimney", "Coal","Igloo", "Jumper", "Myrhh", "Pudding", "Reindeer", "Rejoice", "Icicle", "Midnight", "Shepherd","Surprise", "Gift", "Magi", "Train", "Tree", "White", "Donkey", "Wreath", "Stuffing" }; 

      // ArrayLists will contain the matching items 
      ArrayList<String> firstNamesMatching = new ArrayList<String>(); 
      ArrayList<String> lastNamesMatching = new ArrayList<String>(); 

      // Check which names from firstNames matching the firstLetter 
      String firstLetter = first.getText().substring(0, 1).toUpperCase(); 
      for (String s : firstNames) { 
       if (s.startsWith(firstLetter)) 
        firstNamesMatching.add(s); 
      } 

      // Check which names from lastNames matching the lastLetter 
      String lastLetter = last.getText().substring(0, 1).toUpperCase(); 
      for (String s : lastNames) { 
       if (s.startsWith(lastLetter)) 
        lastNamesMatching.add(s); 
      } 

      JOptionPane.showMessageDialog(null, firstNamesMatching.toArray() + " " + lastNamesMatching); 

также:

Хотя массивы firstNames и lastNames и т.д. должны быть вне ActionListener. Вы должны иметь в виду память, которую использует ваша программа, и не инициализировать одни и те же вещи снова и снова.

+0

Спасибо. Я думаю, что сначала попробую. – JennyJ

+0

Это действительно классный код, так что спасибо, потому что я уверен, что смогу использовать его в какой-то момент. Я не думаю, что это правильно для этого проекта. Например, если кто-то вошел в «Allysa» в качестве своего имени, разве приложение всегда не назначало «Apple» в качестве рождественского имени и никогда не дошло до Ангела? – JennyJ

+0

(Извините, слишком скоро введите «enter».) Я мог бы изменить все имена в массиве, чтобы начать с разных букв, а затем ваш код будет работать красиво. Но я пытался научиться сравнивать элементы, а затем выводить элементы в массивы на основе их позиций. – JennyJ

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