2015-11-12 4 views
2

Итак, у меня есть текстовый файл с именами президентов, который нужно прочитать, а затем пользователь может ввести имя президента (имя или фамилия) и то все президенты с указанным именем (первым или последним) должны отображаться на экране.Распечатайте определенные символы из массива на основе ввода пользователя

Вот код:

import java.util.*; 
import java.io.*; 

public class NameSearch { 

public static void main(String[] args) throws IOException { 
    try { 
     // read from presidents file 
     Scanner presidentsFile = new Scanner(new File("Presidents.txt")); 
     Scanner keyboard = new Scanner(System.in); 
     // create array list of each line in presidents file 
     ArrayList<String> linesInPresidentsFile = new ArrayList<String>(); 

     String userInput = keyboard.nextLine(); 

     // add president file info to array list linesInPresidentFile 
     while (presidentsFile.hasNextLine()) { 
      linesInPresidentsFile.add(presidentsFile.nextLine()); 
     } 

     for (int i = 0; i < linesInPresidentsFile.size(); i++) { 
      // store elements in array list into array literal 
      String presidentNames[] = linesInPresidentsFile.toArray(new String[i]); 

      if (presidentNames[i].toLowerCase().contains(userInput.toLowerCase())) { 
       String splitInfoElements[] = presidentNames[i].split(",", 3); 
       System.out.println(splitInfoElements[0] + " " + splitInfoElements[1] + " " + splitInfoElements[2].replace(",", " ")); 
      } 

     } 

    } catch (FileNotFoundException ex) { 
     // print out error (if any) to screen 
     System.out.println(ex.toString()); 
    } 
} 

}

Ok, так что все работает как надо, за исключением Я хотел бы, что если кто-то типы в типа «сортир», например. он печатает президентов, которых зовут Джон, а не президентов, у которых есть строка «john» от их имени.

Если у кого-то есть указатели, они были бы очень признательны!

+0

Мог бы сделать это с помощью регулярных выражений, где имя президента совпадает с регулярным выражением «\ bjohn \ Ъ», который будет соответствовать слову «Джон» – DBug

+0

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

+0

Просто используйте String.contains(), чтобы выполнить поиск, он должен найти строку, если ее начало заканчивается или посередине – Nanoc

ответ

1

Предполагая, что имя появляется перед фамилией, просто измените ваш, если заявление, как этот

if (presidentNames[i].toLowerCase().startsWith(userInput.toLowerCase())) 

Кроме того, я рекомендовал бы переписать цикл, как этот

for (String fullName : linesInPresidentsFile) { 
    if (fullName.toLowerCase().startsWith(userInput.toLowerCase())) { 
     String splitInfoElements[] = fullName.split(",", 3); 
     if (splitInfoElements.length == 3) { 
      System.out.println(splitInfoElements[0] + " " + splitInfoElements[1] + " " + splitInfoElements[2].replace(",", " ")); 
     } 
    } 
} 

Так просто перебрать linesInPresidentsFile нет необходимо создать массив. И, самое главное, проверьте, чтобы сплит возвращал массив с 3 String перед доступом.

+0

О, спасибо, много! Что делать, если я хочу также ввести фамилию президентов в качестве опции? Есть идеи? – Lushmoney

+0

Если вы знаете, что фамилия будет ... последняя, ​​то есть также метод 'endsWith' –

+0

Да, я понял, что, но конец фактической строки - это диапазон дат, который президент был в офисе, так что wouldn Не работай. Спасибо за совет, это была большая помощь! – Lushmoney

0

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

public class President { 

    private String firstName; 
    private String lastName; 

    // Constructor + Getters & Setters 
} 

Затем, когда вы читаете файл Presidents.txt создать List<President> все записи.

List<President> presidents = createPresidentList(
      Files.readAllLines(Paths.get("Presidents.txt"), Charset.defaultCharset())); 

С методом, чтобы создать список из записей в файле, что-то вроде:

private List<President> createPresidentList(List<String> entries) { 
    List<President> presidents = new ArrayList<>(); 
    for (String entry : entries) { 
     String[] values = entry.split(","); 
     presidents.add(new President(values[0], values[1])); 
    } 
    return presidents; 
} 

Затем, когда вы хотите, чтобы отфильтровать тех, с именем «John» вы можете искать для тех, с первым именем, равным «Джону».

Если вы используете Java 8, вы можете сделать что-то вроде следующего;

String firstName = ... // The name you want to filter on ("John") taken from the user 

... 

List<President> presidentsByFirstNameList = presidentList.stream().filter(p -> p.getFirstName().equals(firstName)).collect(Collectors.toList()); 
Смежные вопросы