2016-01-18 75 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

什么是'addressBook'?您可以在方法的顶部调用'iterator()',但在方法后面的for循环中没有定义称为addressBook的变量。 另外,你永远不会写信给你的'BufferedWriter'。 –

+0

addressBook是一个集合 –

+0

它看起来好像没有用'File new File'逻辑来完成。另外,您是否希望在删除/修改地址条目后彻底覆盖文件的内容? saveAddressBookToFile方法的内容是什么? – pczeus

回答

1

请参阅的SO这个环节,Boolean.TRUE == myBoolean vs. Boolean.TRUE.equals(myBoolean)

这里假定addressBook正确填充数据。 在你的源代码中,你不应该使用== true来检查它,因为equalsIgnoreCase()方法已经会返回truefalse而没有别的。

将其更改为

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

同时,为了避免NullPointerException,最好是始终把你的第一个位置,这样已经知道的值,

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

你在说什么是绝对正确的Shrikant,但没有回答或解决问题。尽管“草率”的语法,他的如果条件确实工作和评估相同作为你的修改。 – 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

我应该在'deleteAddress(String firstName,String lastName)'后调用'saveAddressBookToFile()''在'result =“之后找到地址并将其移除..保存以更新文件。”;' –

+0

是的,您需要调用save作为单独的命令/操作。 – pczeus

+0

您可以修改代码以在添加和/或删除方法中调用保存方法,以在进行更改后保存更多的“自动”。 – pczeus