2016-06-18 4 views
0

Я просто изучаю Java и пытаюсь сделать простую телефонную книгу. Для этой части я пытаюсь предложить пользователю выбрать один из трех вариантов ниже.Создание базовой телефонной книги Java

public class PhoneBook { 

    public static void main (String[] args){ 
     options();  
     /*This method prompts the user to enter phone number 
     String s; 
     Scanner in = new Scanner(System.in); 
     System.out.println("Enter Phone Number"); 
     s = in.nextLine(); 
     System.out.println("You entered phone number "); 
     System.out.println(s);*/ 
    } 

    public static void options(){ 
    //This method gives the user choices on what to do 

     char choice; 
     char enterNumber = 'n'; 
     char showNumber = 's'; 
     char closeBook = 'c'; 

     String read; 
     String freeLine = "error"; 
     Scanner keyboard = new Scanner(System.in); 
     while (true){ 

      System.out.println("Please select from the following"); 
      System.out.println("n to Enter the number"); 
      System.out.println("s to Show the number "); 
      System.out.println("c to Close the Phone book"); 

     read = keyboard.nextLine(); 
     choice = read.charAt(0); 
     switch (choice) { 
     case 'n': enterNumber; 
       system.out.println(); 
     case 's':showNumber; 
       system.out.println(); 
     case 'c': closeBook; 
        break; 
     default: System.out.println("Invalid Entry"); 


     } 
     } 
    } 

} 

Когда я скомпилирую его, я получаю ошибки в строках 37, 39 и 41, говоря «Ошибка: не утверждение». Я чувствую, что чего-то не хватает. Если кто-то может помочь, это будет очень признательно.

+0

Какая линия линии 37? – Timo

+3

Что вы ожидаете от 'case 's': showNumber;' делать? – njzk2

+0

Я не понимаю, как это телефонная книга. Мне кажется, что это что-то вроде «ввести что-то и напечатать» или «повторить эхо». – ifly6

ответ

1

Я предполагаю, что со следующими строками вы хотите напечатать письмо n для enterNumber в консоли?

case 'n': enterNumber; 
      system.out.println(); 

Неправильный синтаксис Java. Вы должны передать значение переменной для вызова метода System.out.println:

case 'n': System.out.println(enterNumber); 

Также отметим, что Java чувствителен к регистру, поэтому у вас есть заклинание System с заглавной буквы.

На стороне записки, вы будете хотеть break; после каждого из ваших case заявлений, в противном случае код из следующих случаев будет выполняться, а также:

switch (choice) { 
    case 'n': System.out.println(enterNumber); 
       break; 
    case 's': System.out.println(showNumber); 
       break; 
    case 'c': System.out.println(closeBook); 
       break; 
    default: System.out.println("Invalid Entry"); 
} 
+0

Я запустил его, и он просто дублирует выбор. Например, когда я выбираю выбор, например, я добавляю «n». Он должен дать мне пустую строку, чтобы я мог ввести номер, но вместо этого он просто повторяет текст выбора. – NekaB

0

вам не придется писать переменную после ' cast ".

См. Ниже код.

import java.util.Scanner; 

public class PhoneBook { 


    public static void main (String[] args){ 
     options();  
     /*This method prompts the user to enter phone number 
     String s; 
     Scanner in = new Scanner(System.in); 
     System.out.println("Enter Phone Number"); 
     s = in.nextLine(); 
     System.out.println("You entered phone number "); 
     System.out.println(s);*/ 
    } 

    public static void options(){ 
    //This method gives the user choices on what to do 

     char choice; 
     char enterNumber = 'n'; 
     char showNumber = 's'; 
     char closeBook = 'c'; 

     String read; 
     String freeLine = "error"; 
     Scanner keyboard = new Scanner(System.in); 
     while (true){ 

      System.out.println("Please select from the following"); 
      System.out.println("n to Enter the number"); 
      System.out.println("s to Show the number "); 
      System.out.println("c to Close the Phone book"); 

     read = keyboard.nextLine(); 
     choice = read.charAt(0); 
     switch (choice) { 
     case 'n': 
     System.out.println(); 
     case 's': 
     System.out.println(); 
     case 'c': 
        break; 
     default: System.out.println("Invalid Entry"); 


     } 
     } 
    } 

} 
+0

В их коде нет «броска». И ваш код только печатает пустые новые строки. – Sekkuar

0

Я сделал для вас специальный ответ. Я не добавляю дополнительных объяснений. Это большой ответ. Я рассказываю больше, чем вы просите, но я сделал все возможное, чтобы сделать читаемый код, чтобы вы могли анализировать шаг за шагом, чтобы понять, что вам нужно, по крайней мере, при попытке сделать телефонную книгу (приложение для консольного тестового диска) , Если вам нужно больше объяснений, напишите в комментариях.

Сначала сделайте PhoneEntry класс:

import java.util.Objects; 

public class PhoneEntry implements Comparable<PhoneEntry> { 
    // https://jex.im/regulex/#!embed=false&flags=&re=%5E%5Ba-zA-Z%5D%7B2%2C%7D((-%7C%5Cs)%5Ba-zA-Z%5D%7B2%2C%7D)*%24 
    private static final String NAME_PATTERN = "^[a-zA-Z]{2,}((\\-|\\s)[a-zA-Z]{2,})*$"; 

    // https://jex.im/regulex/#!embed=false&flags=&re=%5E%5C%2B%3F%5Cd%2B((%5Cs%7C%5C-)%3F%5Cd%2B)%2B%24 
    private static final String NUMBER_PATTERN = "^\\+?\\d+((\\s|\\-)?\\d+)+$"; //^\+?\d+((\s|\-)?\d+)+$ 

    private final String name; 
    private final String number; 

    public PhoneEntry(String name, String number) { 
     if (!name.matches(NAME_PATTERN) || !number.matches(NUMBER_PATTERN)) { 
      throw new IllegalArgumentException(); 
     } 
     this.name = name; 
     this.number = number; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getNumber() { 
     return number; 
    } 

    public boolean nameContainsIgnoreCase(String keyword) { 
     return (keyword != null) 
       ? name.toLowerCase().contains(keyword.toLowerCase()) 
       : true; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == null) { 
      return false; 
     } 
     if (!(obj instanceof PhoneEntry)) { 
      return false; 
     } 
     PhoneEntry phoneEntry = (PhoneEntry) obj; 
     return name.equalsIgnoreCase(phoneEntry.name) 
       && number.equalsIgnoreCase(phoneEntry.number); 
    } 

    @Override 
    public int hashCode() { 
     int hash = 5; 
     hash = 17 * hash + Objects.hashCode(this.name.toLowerCase()); 
     hash = 17 * hash + Objects.hashCode(this.number.toLowerCase()); 
     return hash; 
    } 

    @Override 
    public int compareTo(PhoneEntry phoneEntry) { 
     return name.compareToIgnoreCase(phoneEntry.name); 
    } 
} 

Затем тест-драйв

public class TestDrive { 

    private static final String choices = "nspc"; 

    enum Choice { 
     CREATE, READ, PRINT, CLOSE; 

     static Choice getChoice(char c) { 
      switch (c) { 
       case 'n': 
        return Choice.CREATE; 
       case 's': 
        return Choice.READ; 
       case 'p': 
        return Choice.PRINT; 
       case 'c': 
        return Choice.CLOSE; 
      } 
      return null; 
     } 
    } 

    // Main 
    public static void main(String[] args) { 
     Scanner kbd = new Scanner(System.in); 
     final Set<PhoneEntry> entries = new TreeSet<>(); 
     Choice choice; 
     while ((choice = getChoice(kbd)) != Choice.CLOSE) { 
      switch (choice) { 
       case CREATE: 
        PhoneEntry entry = getPhoneEntry(kbd); 
        if (entry != null) { 
         entries.add(entry); 
        } 
        break; 
       case READ: 
        print(readEntries(entries, kbd)); 
        break; 
       case PRINT: 
        print(entries); 
        break; 
      } 
     } 
    } 

    private static Choice getChoice(Scanner kbd) { 
     System.out.println("\nPlease select from the following"); 
     System.out.println("\tn to Enter the number"); 
     System.out.println("\ts to Show numbers by keyword "); 
     System.out.println("\tp to Show all numbers "); 
     System.out.println("\tc to Close the Phone book"); 
     System.out.print("> "); 
     String input = kbd.nextLine(); 
     Choice choice = null; 
     if (!input.isEmpty() 
       && choices.contains(input.toLowerCase()) 
       && ((choice = Choice.getChoice(input.toLowerCase().charAt(0))) != null)) { 
      return choice; 
     } 
     System.out.println("ERR: INVALID ENTRY. TRY AGAIN"); 
     return getChoice(kbd); 
    } 

    private static PhoneEntry getPhoneEntry(Scanner kbd) { 
     System.out.print("Type contact name: "); 
     String name = kbd.nextLine(); 
     System.out.print("Type phone number: "); 
     String number = kbd.nextLine(); 
     try { 
      return new PhoneEntry(name, number); 
     } catch (IllegalArgumentException ex) { 
      System.out.println("\nERR: WRONG ENTRY"); 
     } 
     return null; 
    } 

    private static void print(Set<PhoneEntry> entries) { 
     System.out.println("\nPHONE NUMBERS\n"); 
     entries.stream().forEach(entry -> { 
      System.out.printf("Name: %s%nPhone: %s%n%n", 
        entry.getName(), entry.getNumber()); 
     }); 
    } 

    private static Set<PhoneEntry> readEntries(Set<PhoneEntry> entries, Scanner kbd) { 
     System.out.print("Type keyword: "); 
     return entries.stream().filter(entry 
        -> entry.nameContainsIgnoreCase(kbd.nextLine())) 
       .collect(Collectors.toCollection(TreeSet::new)); 
    } 
} 
+0

Спасибо! Это выглядит действительно продвинутым, но у меня есть мои книги, поэтому я определенно смогу понять это. – NekaB

+0

Ого, это как три шага впереди, где они сейчас. – Sekkuar

+0

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

0

Вместо enterNumber;, вы должны написать enterNumber();.

Скобки означают: вызов метода.

+0

Спасибо. Я пропустил это. Я добавляю это к своим заметкам :) – NekaB

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