2013-09-18 2 views
0

У меня есть программа, которая позволяет пользователю вводить наблюдения в файл CSV и сохранять их. Я хочу, чтобы иметь возможность читать файл и только распечатывать наблюдения, которые пользователь ищет. (например, типы пользователей на «планете» и все строки, содержащие планету. Мой текущий код печатает весь файл, а не только указанные строки. У меня возникли проблемы с созданием логической инструкции для этого.Распечатка строки из файла CSV, содержащего пользовательский ввод -

Вот мой код:

void findbird() throws IOException{ 


    Scanner input = new Scanner(System.in); 
    System.out.println("Please enter the type of bird you wish to search for"); 
    String bird; 
    bird = input.next(); 
    System.out.println("All observations of " + bird + "s:"); 

    BufferedReader br = new BufferedReader(new FileReader("birdobservations.txt")); 
    String dataRow = br.readLine(); 
    boolean contains = bird.toLowerCase().contains(dataRow.toLowerCase()); 

    while (dataRow != null){ 
     String[] dataArray = dataRow.split(","); 
     for (String item:dataArray) { 
      if(contains = true){ 
       System.out.print(item + "\t"); 
      }else{ 
       System.out.println("No observations of " + bird + " found!"); 
      } 

     } 

     System.out.println(); 
     dataRow = br.readLine(); 
    } 

    br.close(); 
    System.out.println(); 

    menu(); 
} 

Мой выход в настоящее время выглядит следующим образом:

Пожалуйста, введите тип птицы вы хотите найти

Crow

Все наблюдения Вороны: Crow X Берген May2015

Дятел M Oslo July2012

Hummingbird M Каупангер December2015

В то время как я только хочу, чтобы напечатать:

Crow X Bergen May2015

+0

не должны 'если (содержит = истина)' 'быть, если (содержит == верно)' – Prateek

+0

К сожалению, да. Я изменил это, но все тот же результат. – user2791187

+0

Или просто 'if (contains)'. – Dukeling

ответ

0

Есть несколько проблем .... два наиболее вопиющими являются:

  1. boolean contains = bird.toLowerCase().contains(dataRow.toLowerCase());, безусловно, должно быть наоборот (DataRow ... содержит (... птицу ...))
  2. вы никогда не сбросить логическую переменную contains так, что он будет печатать все после первой устанавливается истина ... там должно быть где-то contains = false

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

String dataRow = null; 
while ((dataRow = scanner.readLine()) != null) { 
    .... 
} 

Таким образом, вам не нужно делать глупую readLine вне цикла, что делает ваш код громоздким.

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

0

Это код проблемы

 String dataRow = br.readLine(); 
     boolean contains = bird.toLowerCase().contains(dataRow.toLowerCase()); 

    while (dataRow != null){ 
    String[] dataArray = dataRow.split(","); 
     for (String item:dataArray) { 
      if(contains = true){ 
       System.out.print(item + "\t"); 
      }else{ 
       System.out.println("No observations of " + bird + " found!"); 
      } 
} 

Изменить его

while((dataRow = br.readline())!= null) 
{ 
//And now you get value of contain and then check if contain == true and add other piece of code 
} 
0
  • Вашей contains проверка является неправильным путем вокруг. Формат: string.contains(substring).

  • contains следует перемещать внутри цикла, иначе вы просто устанавливаете его один раз в начале, а не для каждой строки.

  • contains = true должно быть contains == true или просто contains. contains = true - это назначение и всегда будет возвращать true, независимо от значения contains.

  • Переместите contains за пределы for-loop, иначе он будет печатать сообщение для каждого столбца в строке, а не только один раз в строке.

  • System.out.println(); приведет к печати пустых строк, если это нежелательно (возможно, это так), его следует удалить.

Код:

while (dataRow != null){ 
    boolean contains = dataRow.toLowerCase().contains(bird.toLowerCase()); 
    String[] dataArray = dataRow.split(","); 
    if(contains){ 
     for (String item:dataArray) { 
      System.out.print(item + "\t"); 
     } 
    } 
    else 
    { 
     System.out.println("No observations of " + bird + " found!"); 
    } 

    dataRow = br.readLine(); 
} 
+0

Спасибо, это определенно то, что я искал! Я получаю много пустых строк на моем выходе, хотя они соответствуют строкам в файле, который не совпадает. Есть ли способ обрезать это? – user2791187

+0

@ user2791187 Отредактировано. – Dukeling

0

У вас есть логика в обратном направлении. У:

boolean contains = dataRow.toLowerCase().contains(bird.toLowerCase()); 

Кроме того, тот факт, что у вас есть:

  if(contains = true){ 
       System.out.print(item + "\t"); 
      }else{ 
       System.out.println("No observations of " + bird + " found!"); 
      } 

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

 if(contains == true){ 
      System.out.print(item + "\t"); 
     }else{ 
      System.out.println("No observations of " + bird + " found!"); 
     } 
+0

строка if (contains = true) также находится в ошибке (должна быть == (или no = true), подумайте над ее добавлением к вашему ответу. –

+0

Спасибо, я не могу поверить, что я пропустил это. – BlackHatSamurai

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