자료구조?

Java 2009. 8. 14. 01:14

프로젝트를 하다가, 분류삭제 기능을 맡게 되었습니다.
상위분류를 삭제하면 연관된 하위분류도 같이 삭제되어야 하지요. 하지만 DB테이블에 PK를 복합키로 잡아놨기 때문에 CASCADE와 같은 간편한 기능을 쓰지 못합니다.
그래서 짠 로직이 다음과 같습니다. (HashMap의 유용함을 며칠전 발견하여;; 죽어라 이것만 쓰고있음)

public class CareerActivityDelete_Logic {

 public List<CategoryModel> elaborationDelete(List<CategoryModel> tempList,CategoryModel cm){
  HashMap delTemp = new HashMap(); //삭제할 레코드 no를 담는다. 키값은 0부터 시작
  HashMap vig = new HashMap();
  int cas_seqnum = cm.getCategories_seqNum(); //분류체계일련번호
//  System.out.println("카스넘"+cas_seqnum);
  int ca_seqnum = cm.getNo(); //삭제하려는 분류 일련번호
//  System.out.println("카넘"+ca_seqnum);
  int listSize = tempList.size();
  int keyvalue = 0;
  
해쉬맵이 유용하지만, 유의할 점은 이것을 컬렉션 List와 value비교에 사용할 경우 맵객체에 List의 모든 값들로 초기화를 시켜주어야 한다는 것입니다.

  ArrayList<CategoryModel> wList = new ArrayList<CategoryModel>();
  CategoryModel cdl;
  //먼저 해당하는 분류체계만을 정제해서 리스트를 다시 만듬
  for(int i=0; i<listSize; i++){
   CategoryModel ct = tempList.get(i);
   cdl = new CategoryModel();
   if(ct.getCategories_seqNum() == cas_seqnum){
    cdl.setNo(ct.getNo());
    cdl.setCategories_seqNum(ct.getCategories_seqNum());
    cdl.setUp_category_seqnum(ct.getUp_category_seqnum());
    vig.put(cdl.getNo(), -1);
   }
   wList.add(cdl);
  }
  
  int wsize = wList.size();
  int[] delSave = new int[wsize];
//  System.out.println("wList사이즈"+wsize);
  
  for(int i = 0; i<wsize; i++){
   CategoryModel ct = wList.get(i);
    //루프돌면서 no가 삭제하려는 no와 같은경우
    if(ct.getNo() == ca_seqnum){
     delSave[keyvalue] = ct.getNo();
     delTemp.put(keyvalue, ct.getNo());
     keyvalue = keyvalue + 1;
//     System.out.println("delTemp현재"+delTemp.get(keyvalue-1));
    }
//    System.out.println("지금싸이즈"+delTemp.size());
    //삭제하려는 객체를 담는delTemp의 사이즈가 0이 아니라면 로직을 수행
    if(delTemp.size() != 0){
     for(int j=0; j<delTemp.size(); j++){
      for(int k=0; k<wsize; k++){
       CategoryModel gm = wList.get(k);
       if( (int)gm.getUp_category_seqnum() == (Integer)delSave[j]){
        if((Integer)vig.get(gm.getNo()) != -1){
//         System.out.println("이미존재합니다");
        }else if((Integer)vig.get(gm.getNo()) == -1){
         delTemp.put(keyvalue, gm.getNo());
         vig.put(gm.getNo(), gm.getNo());
         delSave[keyvalue] = gm.getNo();
         System.out.println("delTemp진짜나와라"+delTemp.get(keyvalue));
         keyvalue = keyvalue + 1;
        }
       }else{
       }
      }
     }
    }
  }
  
  //최종적으로 DAO로 보내기 위한 List객체를 만든다
  List<CategoryModel> retList = new ArrayList<CategoryModel>();
  CategoryModel cry;
  for(int i=0; i<delTemp.size(); i++){
   cry = new CategoryModel();
   cry.setCategories_seqNum(cas_seqnum);
   cry.setNo((Integer)delTemp.get(i));
   retList.add(cry);
  }
//  System.out.println("retList사이즈"+retList.size());
  return retList;
 }

}

제가 짜놓고도 오늘 다시보니 잘 모르겠네요ㅋㅋ 주석을 더 달았어야 했나 봅니다.
자료구조를 공부한 적이 없습니다. 위의 로직보다 더 깔끔한 코드로 짤 수도 있겠죠...
뭐 아무튼 중요한것은 제 스스로 짰다는 것,ㅋ 로직을 스케치하고 생각한대로 구현해 냈다는 점..
자신감이 조금씩 생깁니다.


  

AND