2016-01-18 2 views
0

У меня есть программа в java для сохранения и удаления адресов в файл csv. Теперь я хочу, чтобы удалить конкретный адрес из файла CSV, так что я написал функцию для этого какКак удалить определенную запись из файла csv?

public String deleteAddress(String firstName,String LastName,String msg) throws IOException{ 
    Iterator<Address> it = addressBook.iterator(); 
    n=msg; 
     while(it.hasNext()){ 
      Address newObj = it.next(); 
      if((newObj.getFirstName().equalsIgnoreCase(firstName) == true) && (newObj.getLastName().equalsIgnoreCase(LastName) == true)){ 
       File newfile = new File("address.csv"); 
       BufferedWriter bw = new BufferedWriter(new FileWriter(newfile)); 
       it.remove(); 
       n="found and removed"; 
      } 
     } 


     for(Address newObj : addressBook){ 
      AddressBookSave.saveAddressBookToFile(newObj); 
     } 
     return n; 
} 
} 

, но он не работает должным образом. Кто-то, пожалуйста, помогите мне исправить это.

+1

Что такое 'адресная книга'? Вы вызываете 'iterator()' на нем в верхней части вашего метода, но нет переменной, называемой 'addressBook', определенной до конца цикла' for' в методе. Кроме того, вы никогда не пишете свой «BufferedWriter». –

+0

addressBook - это набор –

+0

Он также выглядит так, как будто ничего не делается с логикой «File new File». Кроме того, является ли ваше намерение полностью перезаписать содержимое файла после удаления/изменения записи адреса? Каково содержимое метода saveAddressBookToFile? – pczeus

ответ

1

Пожалуйста, обратитесь к ссылке на SO, Boolean.TRUE == myBoolean vs. Boolean.TRUE.equals(myBoolean)

Здесь предполагается, что addressBook правильно заполняется данными. В вашем исходном коде вы не должны проверять его с помощью == true, поскольку метод equalsIgnoreCase() уже возвращает либо true, либо false и ничего больше.

Изменить его

if((newObj.getFirstName().equalsIgnoreCase(firstName)) && (newObj.getLastName().equalsIgnoreCase(LastName))) 

Кроме того, чтобы избежать NullPointerException, то лучше всегда ставить значение, которое вы знаете, уже в первой позиции, как это,

if((firstName.equalsIgnoreCase(newObj.getFirstName())) && (LastName.equalsIgnoreCase(newObj.getLastName()))) 
+0

То, что вы говорите, абсолютно верно, Shrikant, но не отвечает или не решает проблему. Несмотря на «неаккуратный» синтаксис, его условие if работает и оценивает то же, что и ваш измененный. – pczeus

0

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

Не знаю точно, каковы ваши требования enter code here, я не могу ударить его прямо по отметке. Тем не менее, вот полный класс образцов, который я написал в Groovy (очень близко к Java, но лучше), который выполняет то, что я 'думаю' вы пытаетесь выполнить. Если это вам поможет, отметьте этот пример как ясный ответ.

Не стесняйтесь запускать ниже класс Groovy и попробовать его.

import groovy.transform.Canonical 

import javax.swing.* 

public class AddressBook { 
    List<Address> addressBook = new ArrayList<>(); 
    String filePath; 

    public String deleteAddress(String firstName, String lastName) { 
     String result = "Not Found" 
     Iterator<Address> iter = addressBook.iterator(); 
     while(iter.hasNext()){ 
      Address addy = iter.next(); 
      if ((addy.getFirstName().equalsIgnoreCase(firstName)) && (addy.getLastName().equalsIgnoreCase(lastName))) { 
       iter.remove(); 
       result = "Address was found and removed..save to update the file."; 
      } 
     } 

     println result; 
     return result; 
    } 

    void addAddress(String firstName, String lastName, String addyString){ 
     addressBook.add(new Address("firstName":firstName, "lastName":lastName, "address":addyString)); 
     println "Address added..save to update the file."; 
    } 

    void saveAddressBookToFile() throws IOException{ 
     BufferedWriter bw = null; 
     println "Saving addresses to file: " + filePath; 
     try{ 
      File file = new File(filePath); 
      bw = new BufferedWriter(new FileWriter(file)); 
      file.createNewFile() 
      for(Address addy: addressBook){ 
       bw.write(addy.toString() + "\n"); 
      } 
      bw.flush(); 
     } 
     finally{ 
      if(bw){ 
       bw.close(); 
      } 
     } 
    } 

    void loadAddressBook(String path) throws IOException{ 
     addressBook.clear(); 
     filePath = path; 
     BufferedReader br = null; 
     try{ 
      List<String> lines = new BufferedReader(new FileReader(path)).readLines(); 
      for(String line: lines){ 
       addressBook.add(new Address(line)); 
      } 
      println path + " loaded successfully." 
     } 
     catch(FileNotFoundException fnfe){ 
      println "File " + path + " does not exist, nothing loaded."; 
     } 
     finally { 
      if (br) { 
       br.close() 
      } 
     } 
    } 

    void printLoadedAddresses(){ 
     for(Address addy: addressBook){ 
      println addy.prettyString(); 
     } 
    } 

    public static void main(String... args) { 
     AddressBook ab = new AddressBook(); 
     String readln = ' ' 

     while(readln){ 
      readln = JOptionPane.showInputDialog('Please input a valid command: load, add, delete, save') 

      if (readln) { 
       args = readln.split() 
       switch (args[0]) { 
        case "load": 
         if (args.length < 2) { 
          println("You did not provide the second argument for the address csv file path.") 
          break; 
         } else { 
          ab.loadAddressBook(args[1]) 
         } 
         break; 
        case "add": 
         if(args.length < 4){ 
          println("Please provide the firstName, lastName, and address parameters when adding.") 
         } 
         else { 
          ab.addAddress(args[1], args[2], args[3..-1].join(" ")); 
         } 
         break; 
        case "delete": 
         if(args.length < 3){ 
          println("Please provide the firstName, lastName, and address parameters when deleting.") 
         } 
         else { 
          ab.deleteAddress(args[1], args[2]); 
         } 
         break; 
        case "save": 
         if (ab.filePath) { 
          ab.saveAddressBookToFile(); 
         } else { 
          println("You must first call load with a file path for the csv file (even it it doesn't exist yet.") 
         } 
         break; 
        case "print": 
         ab.printLoadedAddresses(); 
         break; 
        case "exit": 
         System.exit(0) 
        default: 
         println "Unrecognized command: " + args[0] 
       } 
      } 
     } 
    } 
} 

@Canonical 
class Address { 
    String firstName; 
    String lastName; 
    String address; 

    public Address(){ 
     super 
    } 

    public Address(String csvString){ 
     List<String> tokens = csvString.split(","); 
     firstName = tokens[0]; 
     lastName = tokens[1]; 
     address = tokens[2] 
    } 

    @Override 
    public String toString(){ 
     return firstName + "," + lastName + "," + address; 
    } 

    public String prettyString(){ 
     return firstName + " " + lastName + " - " + address; 
    } 
} 
+0

Должен ли я называть 'saveAddressBookToFile()' in' deleteAddress (String firstName, String lastName) 'после' result = "Адрес был найден и удален .. для обновления файла."; ' –

+0

Да, вам нужно вызвать save как отдельная команда/операция. – pczeus

+0

Вы можете изменить код, чтобы вызвать метод сохранения в методах добавления и/или удаления, чтобы сохранить автоматическое сохранение после внесения изменений. – pczeus

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