2014-01-20 2 views
-1

Ниже приведена программа, в которой я читаю файл с двумя столбцами. то есть имя, а второе - голосование. Я читаю каждую строку, и когда введенное имя пользователем соответствует условию i.e, если имя существует в файле, оно предлагает, чтобы вы уже голосовали и не могли голосовать снова. Он выполняет поиск записи, но почему-то не выходит, пока не завершит общее количество строк в моем файле.Выход из цикла при выполнении условия соединения из файла.

Также, как я могу подсчитать общее количество голосов, то есть из столбца два. предположим, что у меня есть два типа записей YES и NO в этом столбце, как я могу рассчитать общее количество YE и No и сравнить их?

Спасибо за помощь заранее

package samples; 

import homework.EmployeeA; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class Votes { 

    public static void main(String[] args) { 

     File f = new File("E://Employee/votes.txt"); 

     try { 
      Scanner s= new Scanner(f); 
       System.out.println("Is motion open for voting?. Press \n1: Yes\n2: No"); 

      Scanner scan = new Scanner (System.in); 
      int choice = scan.nextInt();`enter code here` 


    while(s.hasNext()) 
    { 
     String line = s.nextLine(); 

     String temp[]= line.split(" "); 

     EmployeeA e = new EmployeeA("hiren", "yes"); 

     e.name = temp[0]; 

     e.vote = temp[1]; 

     ArrayList<EmployeeA> list = new ArrayList<EmployeeA>(); 

     list.add(e) ; 



     for (int i=0; i<list.size(); i++) 
     { 
      EmployeeA t= list.get(i); 




     if (choice==1) 
     { 
     System.out.println("Please enter your name to start voting"); 
     String vname=scan.next(); 

     if (t.name.equalsIgnoreCase(vname)) 
     { 
System.out.println("opps you have already voted once and you are not eligible to vote again"); 
     } 
     else 
     { 
      System.out.println("Hey greate news"); 
     } 
     } 

if (choice==2) 
{ 

    { 
     System.out.println(" Please have patience till Motion is opened for voting"); 
    } 


} 





    StringBuffer sb = new StringBuffer("D://Employee/votes.txt"); 
    try{ 
     FileWriter fwriter = new FileWriter(f); 
     BufferedWriter bwriter = new BufferedWriter(fwriter); 
     bwriter.write(sb.toString()); 
     bwriter.close(); 
    } 
    catch (IOException e1){ 
      e1.printStackTrace(); 
*/ 


    } 

    } 

    if (choice==2) 
    { 

     { 
    System.out.println(" Please have patience till Motion is opened for voting"); 
     } 


    } 
    } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 



    } 

} 
+4

Пожалуйста, исправьте форматирование, если хотите помочь. Также было бы полезно увидеть vote.txt и, возможно, укоротить код до соответствующих частей. – BroSlow

+0

babubhai да hiren Нет bob Да samir Да Canon No – user2498339

ответ

0

Для выхода из чтения файла сразу имя соответствует существующей записи, используйте оператор «перерыв». В java оператор break используется для выхода из цикла for (что вам нужно в этом случае), и поскольку записи в файле считываются из цикла, он выходит из файла. Поэтому изменять этот раздел кода:

if (t.name.equalsIgnoreCase(vname)) 
    { 
     System.out.println("opps you have already voted once and you are not eligible to vote again"); 
     break; // This statement will exit the terminate the loop immediately 
    } 

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

String line; // make this string hold each line in the file 
    int yes = 0, no = 0; 
    Scanner s = new Scanner(f) // Start reading from the top of the file 
    while (s.hasNext()) { 
     line = s.nextLine(); 
     String[] values = line.split(" "); 
     String vote = values[1] // Assuming it is name followed by vote 
     if (vote.equalsIgnoreCase("No")) // Or you can directly use values[1].equalsIgnoreCase("No") 
      yes++; 
     else 
      no++; 
    } 
    // Now yes holds count of "Yes" votes and no holds count of "No" votes 
+0

Большое спасибо за ваш ответ. Но проблема в том, что она начинается с первой строки и даже после добавления перерыва к ней, она не выходит из цикла. Как вы сказали (и поскольку записи в файле считываются из цикла, он выходит из чтения файла. Поэтому измените этот раздел кода на :) i dint действительно получил это, чтобы вы могли помочь мне понять это? – user2498339

+0

, если пользователь уже проголосовал, он отобразит сообщение, как указано выше, и он должен выйти из цикла. Если ни один пользователь не проголосовал, запись будет добавлена ​​в текстовый файл, а затем подсчитана общее количество да и нет голосов. – user2498339

+0

Я не уверен, что понял ваш вопрос, но я попытаюсь объяснить - оператор break используется для выхода из цикла for, внутри которого он помещен. В вашем случае цикл for начинает итерацию с начала файла (и это правильно и ожидается). Когда встречается совпадение имен, оно в основном завершает цикл for, тем самым останавливая итерацию над записями в файле, а затем выходит из нее. Просматривая свой код, похоже, что у вас есть логическая ошибка: чтобы добавить запись (если нет, в новый файл), поместите раздел FileWriter в блок else, который печатает «Привет, отличные новости» – ucsunil

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