2014-07-22 2 views
-2

사용자가 입력 한 세부 정보가있는 특정 직원을 삭제하려고합니다. java.Deletion에서 직렬화 연산을 사용하여 원하는 방식으로 작업을 수행하지 않습니다. 사용자가 입력 한 세부 정보가있는 직원을 삭제하려고합니다. 그러나 모든 직원을 삭제합니다.어떻게하면 Java에서 직렬화를 사용하여 특정 직원을 삭제할 수 있습니까?

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

    public class SerializationDemo { 
    public static void main(String[] args) throws IOException, ClassNotFoundException{ 
     //choice provided to the user 
     System.out.println("Welcome To Employee Management System"); 
     System.out.println("Enter your choice"); 
     System.out.println("Enter 1:->show employees"); 
     System.out.println("Enter 2:->Create new employee"); 
     System.out.println("Enter 3:->Delete employee"); 
     System.out.println("Enter 4:->quit"); 

     Scanner in = new Scanner(System.in); 
     int choice = in.nextInt(); 

     ArrayList<Myclass> object1 = new ArrayList<Myclass>(); 
     //insert operation 
     if(choice==2){ 
      try{ 
       String str1; 
       String str2; 
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
       System.out.println("Enter number of employees you want to add"); 
       Scanner in1 = new Scanner(System.in); 
       int num = in1.nextInt(); 

       //ArrayList<Myclass> object1 = new ArrayList<Myclass>(); 

       for(int i=0;i<num;i++){ 

        str1 = br.readLine(); 
        str2 = br.readLine(); 
        object1.add(new Myclass(str1,str2)); 
       } 

       FileOutputStream fos = new FileOutputStream("Myfile.txt"); 
       ObjectOutputStream oos = new ObjectOutputStream(fos); 

       oos.writeObject(object1); 
       oos.flush(); 
       oos.close(); 
      } 
      catch(Exception e){ 
       System.out.println("exception"); 
       e.printStackTrace(); 
       System.exit(0); 
      } 
     } 
     //show operation 
     if(choice==1){ 
      try{ 
       FileInputStream fis = new FileInputStream("Myfile.txt"); 
       ObjectInputStream ois = new ObjectInputStream(fis); 
       ArrayList object2 = (ArrayList)ois.readObject(); 

       ois.close(); 
       System.out.println("employee details "+" "+object2); 
      } 
      catch(Exception e){ 
       e.printStackTrace(); 
      } 

     } 

     if(choice==3){ 
      System.out.println("Enter name and department of employee you want to delete"); 
      try { 

       String str3; 
       String str4; 
       BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in)); 
       str3 = br1.readLine(); 
       str4 = br1.readLine(); 

       /*FileInputStream Fs = new FileInputStream("Myfile"); 
       ObjectInputStream Os = new ObjectInputStream(Fs); 
       ArrayList<Myclass> object3 = (ArrayList<Myclass>)Os.readObject();*/ 

       object1.remove(new Myclass(str3,str4)); 

       FileOutputStream fs = new FileOutputStream("Myfile.txt"); 
       ObjectOutputStream os = new ObjectOutputStream(fs); 
       os.writeObject(object1); 
       os.flush(); 
       os.close(); 

      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 

     } 
     //exit operation 
     if(choice==4){ 
      System.exit(0); 
     } 

    } 
} 


    class Myclass implements Serializable{ 
     String name; 
     String dname; 
     public Myclass(String name,String dname){ 
      this.name = name; 
      this.dname = dname; 
     } 
     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     public String getDepartment() { 
      return dname; 
     } 

     public void setDepartment(String dname) { 
      this.dname = dname; 
     } 
     public String toString(){ 
      return "name = "+" "+name+","+" "+"department = "+" "+dname; 
     } 
    } 

답변

0

@AmitChotaliya이 그런 다음

FileInputStream Fs = new FileInputStream("Myfile.txt"); 
ObjectInputStream Os = new ObjectInputStream(Fs); 
ArrayList<Myclass> object3 = (ArrayList<Myclass>)Os.readObject(); 

를 직렬화 해제를 제거 당신이 필요 ArrayList를

첫 번째에서 개체를 삭제하기 위해 할 수있는 무엇 예입니다 명확하게

설명했다 하지만 이것은 빠른 속도입니다.

for(int index = 0; i < object3.size(); i++) 
{ 
    if(object3.get(i).getName().equals(str3) && object3.get(i).getDepartment().equals(str4)) 
    { 
     object3.remove(index); 
     break; 
    } 
} 

하지만 페일 세이프로 제거하려는 경우

Iterator itr = object3.iterator(); 

while(itr.hasNext()) { 
    Myclass element = (Myclass) itr.next(); 
    if(element.getName().equals(str3) && element.getDepartment().equals(str4)) 
    { 
     itr.remove(); 
     break; 
    } 
} 
+0

@Steven 감사합니다.하지만이 작업을 수행 할 수 없습니다. ArrayList는 fail-fast이므로 for 루프를 사용하여 반복 할 수없고 remove를 호출 할 수 없습니다. http://stackoverflow.com/questions/17377407/what-is-fail-safe-fail-fast-iter-iter-in-java-how-they-are-implemented. Iterator를 사용하여 반복을 수행 한 다음 remove를 제거해야합니다. – bitkot

+0

감사합니다. @AmitChotaliya 나는 그것을 추가했습니다 : D –

+0

스티븐 Gunanto. 그것은 작동했습니다 – bablu

1

두 가지 문제가 있습니다.

  • 선택 항목에서 개체를 제거하고 다시 일련 화하기 전에 개체를 object1 목록으로 직렬화 해제해야합니다.
  • MyClass에는 equals()hashCode() 메서드가 필요합니다. list.remove()는 목록에서 지정한 객체를 찾을 수 없으므로 그렇지 않습니다.
+0

감사합니다. AmitChotaliya. hashcode() 및 equals()를 구현 한 다음 구현했습니다. 그것은 효과가 있었다. 고맙습니다. – bablu

관련 문제