본문 바로가기
TechNical/JAVA

VECTOR 랑 친해져 보자. 배열에서 중복 문자 카운트

by 강멍멍이 2008. 12. 16.
반응형
무엇인고 하니.. 벡터란 놈을 써보기로 했다.
벡터란 녀석은 배열의 확장판이라고 할까나.. 암튼 배열보다 욜랭 좋은 거다.
배열은 사용 할라믄 첨에 초기화를 해서 사이즈를 정해 줘야 한다. 근데 이 생키는 그럴 필요 없다.
데이터가 입력되면 알아서 지가 늘어 난다. 그리고 저장할때 타입을 지정해 줄 수도 있다고 한다. 잘은 모르겠다.
그래서 요걸 이용해서 문자가 들어 있는 배열을 돌면서 중복된 문자는 제외하고 새로운 배열을 만들꺼다.
근데 중복된 걸 제외한다고 해도 몇 개다 들어 있는지 알 수 없으므로 배열을 생성할 때 사이즈를 정하는게 애매하다.
벡터는 아까도 얘기 했다싶이 미리 사이즈를 지정 안 해 줘도 된다. 그래서 벡터 썼다.

[ v_test.java ]

import java.util.*;
public class v_test {
 public static void main(String[] args) throws Exception {
  // 데이터를 담을 벡터
  Vector v = new Vector();
  // 중복 제거 할 벡터
  Vector d = new Vector();
 
  // 1. 데이터를 차곡차곡 생성하자.
  String s1 = "AAA";
  String s2 = "BBB";
  String s3 = "AAA";
  String s4 = "BBB";
  String s5 = "AAA";
  String s6 = "CCC";
 
  v.addElement(s1);
  v.addElement(s2);
  v.addElement(s3);
  v.addElement(s4);
  v.addElement(s5);
  v.addElement(s6);
  v.addElement(s6);
  v.addElement(s2);
  v.addElement(s1);
  v.addElement(s6);
  v.addElement(s6);
  v.addElement("KEI");
 
 
  // 2. 뭐가 들었는지 확인하고
  for (int i = 0 ; i < v.size() ; i++ ) {
   System.out.println(v.elementAt(i));
  }
 
  // 3. 데이터가 들어 있는 놈의 사이즈 만큼 뱅뱅 돈다.
  for (int j = 0 ; j < v.size() ; j++ ) {
   
   String v_tmp = (String)v.elementAt(j);  // 현재 row의 값을 담아뒀다가
   Boolean existFlag = false;     // 요놈은 기존에 값이 있는가 없는가 체크하는 깃발
   
   // System.out.println("d size : " + d.size());
   // 4. 최초에는 d 벡터의 값이 없으므로 v벡터의 첫번째 값을 무조건 넣어 준다.
   if ( d.size() == 0 ) {
    d.addElement(v_tmp);
   }
   
   // 5. d 벡터에 있는 데이터 수 만큼 돈다. d.size()는 데이터가 들어 갈 수록 늘어 나겠지?
   for (int z = 0 ; z < d.size() ; z++ ) {
    String d_tmp = (String)d.elementAt(z);
    // System.out.println(v_tmp + "   " + d_tmp);
   
    // 6. d 벡터에 현재 v 벡터의 값이 있으면 진짜 플레그로 변신
    if ( d_tmp.equals(v_tmp) ) {
     existFlag = true;
    }   
   }
   
   // 7. 현재 v벡터의 값이 없다면 d 벡터에 넣는다.
   if ( existFlag == false ) {
    d.addElement(v_tmp);
   }
  }
 
  // 8. 결과를 보자.
  System.out.println("");
  System.out.println("Distinct Vector V ===============");
 
  for (int k = 0 ; k < d.size() ; k++ ) {
   System.out.println(d.elementAt(k));
  }
 
 }
}


주석을 착실히 달아놔서 그냥 봐도 알거 같다.. 모름 말구.. ㅡㅡ
근데 이번에는 중복된게 몇 개 인지 카운트가 하고 싶어 졌다. 위에꺼의 확장판이라고나 할까..

[ v_test2.java ]

import java.util.*;
public class v_test2 {
 public static void main(String[] args) throws Exception {
  // 데이터를 담을 벡터
  Vector v = new Vector();
  // 중복 제거 할 벡터
  Vector d = new Vector();
   
  // 1. 데이터를 차곡차곡 생성하자.
  String s1 = "AAA";
  String s2 = "BBB";  
  String s3 = "CCC";
 
  v.addElement(s1);
  v.addElement(s2);
  v.addElement(s3);
  v.addElement(s1);
  v.addElement(s1);
  v.addElement(s2);
  v.addElement(s2);
  v.addElement(s2);
  v.addElement(s1);
  v.addElement(s3);
  v.addElement(s3);
  v.addElement("KEI");
 
 
  // 2. 뭐가 들었는지 확인하고
//  for (int i = 0 ; i < v.size() ; i++ ) {
//   System.out.println(v.elementAt(i));
//  }
 
  // 3. 데이터가 들어 있는 놈의 사이즈 만큼 뱅뱅 돈다.
  for (int j = 0 ; j < v.size() ; j++ ) {
   
   String v_tmp = (String)v.elementAt(j);  // 현재 row의 값을 담아뒀다가
   Boolean existFlag = false;     // 요놈은 기존에 값이 있는가 없는가 체크하는 깃발
   
   // System.out.println("d size : " + d.size());  
   
   // 4. 최초에는 d 벡터의 값이 없으므로 v벡터의 첫번째 값을 무조건 넣어 준다.
   if ( d.size() == 0 ) {
    String[] tmp_s = {v_tmp,"0"};
    d.addElement(tmp_s);
   }  
   
   // 5. d 벡터에 있는 데이터 수 만큼 돈다. d.size()는 데이터가 들어 갈 수록 늘어 나겠지?
   for (int z = 0 ; z < d.size() ; z++ ) {
    String[][] zz = new String[d.size()][2];
    d.copyInto(zz);
   
    String[] d_tmp = (String[])d.elementAt(z);
    // System.out.println(v_tmp + "   " + d_tmp);
   
    // 6. d 벡터에 현재 v 벡터의 값이 있으면 진짜 플레그로 변신
    if ( d_tmp[0].equals(v_tmp) ) {
     existFlag = true;
     // 몇개 들어 있는지 카운트 한다
     d_tmp[1] = Integer.toString(Integer.parseInt(d_tmp[1]) + 1);
     // String[] tmp_s = {v_tmp,d_tmp[1]};    // 배열로 변신하는 순간 그대로 따라가는가부다.
     // System.out.println(tmp_s);
     // d.setElementAt(tmp_s,1);
    }
   }
   
   // 7. 현재 v벡터의 값이 없다면 d 벡터에 넣는다.
   if ( existFlag == false ) {
    String[] tmp_s = {v_tmp,"1"};
    d.addElement(tmp_s);
   }
   
  }
 
  // 8. 결과를 보자.
  System.out.println("");
  System.out.println("Distinct Vector V : " + d.size() + "종류 (TOTAL " + v.size() + ")");
 
  String[][] tt = new String[d.size()][2];
  d.copyInto(tt);
 
  for (int k = 0 ; k < d.size() ; k++ ) {
   String[] o_d = (String[])d.elementAt(k);
   System.out.println(o_d[0] + "는 " + o_d[1] + "개가 있다");
  }
 
 }
}


보다시피 이놈을 2차원 배열로 만들고 그걸 꺼내다가 다른거랑 비교 할려구 하니 좀 짜증나게 변신했다.
{문자, 갯수} 이런 형태의 배열로다가 벡터에다가 집어 넣었더니 발생한 상황이다.
벡터에 담을때 배열 형태로 담았으니 끄집어 낼 때도 배열 형태로 끄집어 내야 한다.
요거 하면서 젤 짱났던 거시기..

Integer.toString(Integer.parseInt(d_tmp[1]) + 1);

이 부분.. 쌍쌍바.. 타입케스팅 헷갈린다.. ;;
문자를 숫자로 바꿨다가 더해서 다시 문자로 바꿔놔야 한다능... 냠.. ㅡㅡ

그리고 아리까리 한거.. =_=;
이렇게 해도 제대로 된다는거.. 으허허

d_tmp[1] = Integer.toString(Integer.parseInt(d_tmp[1]) + 1);

요놈을 주석으로 쳐 막고 아래와 같이 해도 똑같이 작동한다.

String[] tmp_s = {v_tmp,Integer.toString(Integer.parseInt(d_tmp[1]) + 1)};
d.setElementAt(tmp_s,z);

한넘은 그냥 변신한 녀석에다가 막바로 쳐 박는거 같고.. 밑에꺼는 setElementAt 해서 제대로 하는거 같은데.
... 역시나 부족한 내공으로 잘은 모르겠다. ㅋㅋㅋㅋㅋ

귀찮다. 여기까지.
반응형

댓글