메뉴 건너뛰기

조회 수 4941 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

 다양한 문자를 조합하여 ID 를 만들며 카운팅 수만큼 증가하여 문자열로 반환한다.

* 제목을 정하기 정말 힘들군요... 의미 전달이 전혀되지 않을 것 같네요;;

다양한 문자을 배열로 조합하여, 카운팅됨에 따라 오름차순 문자열을 완성하여 반환한다.

문자열 ID를 이용할 경우의 장점.

1. 숫자형이 아닌 문자열로 구현된 ID 및 코드를 구현할 때.
2. 쉽게 알아보기 힘든 코드를 구현할 때.
(숫자형으로 할 경우 GET 방식으로 쉽게 페이지를 호출할 수 있는 문제가 있다. 싸**드 같은 경우 비공개나 일촌공개로 설정된 사진도 날짜만 잘 조합하면 쉽게 열수 있는 문제가 있었다. 아마도 지금은 막았겠지만 또한 인젝션해킹이 문자열보다 인지하기 편해서 쉽게 이루어진다.)

3. 0~9 까지만 표현할 수 있는 숫자 조합보다 몇배 자료를 구현할 수 있다.

로직은 다음과 같다. 임의의 배열을 만들어 놓고, [a,z,s,e,1] 0 => a , 1 => z , 2 => s 각 문자의 실제 숫자값은 배열의 순서가 된다.
012 => azs 가 되는 것이다. 오름차값을 1을 할 경우 다음의 값은 aze 가 된다. 숫자,영문소문자,영문대문자 를 조합할 경우 한자리 표시를 61개까지 구성할 수 있다. 0~9 숫자로 할때에 비해 6배나 많은 량이다.

초기값은 원하는 자리수 만큼 정해줘야 한다. aaaa 가 4자리의 초기값이 되는 것이다. 다음 값은 aaaz 가 된다.
오름값은 생성하지 않을 경우 1111 일때 다음 값을 생성할때 오류가 발생한다.

소스 코드는 가장 많이 사용되는 자바스크립트로 개발하였고, 다시 자바로 컴버전하였다. 언어에 맞게 소스수정만 하면 어느 언어든 사용할 수 있을 것 이다. 자바는 http://commons.apache.org/lang 라이브러리의 ArrayUtils 사용했다.

* 예외처리는 직접 해주세요;;

 자바스크립트 소스


/**
  * programmed by Seok Kyun. Choi. (최석균)
  * http://syaku.tistory.com
  */
 var number = ['0','1','2','3','4','5','7','8','9'];
 var alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
 var ALPHABET = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
 var all = number.concat(alphabet).concat(ALPHABET);

 function string2integer(str) {
   var total = all.length;
   var chr = str.length;
   var data = [ ];

   for (var c = (chr-1); c >= 0; c--) {
     var s = str[c]; // 인수 문자

    for (var i = 0; i < total; i++) {
       var key = all[i];

       if (key == s) { data.push(i); } // 인수의 문자와 all 배열의 문자가 일치할 경우 배열에 삽입.
     }

   }

   return data; // 배열리턴

}

function integer2string(ar,num,is) {

   var total = all.length;
   var count = ar.length;
   var is_key = false;
   var data = [ ];

   for (var i = 0; i < count; i++) {
     var key = ar[i];

     if (i ==0) { // 첫번째 배열에 인수의 값을 더함.
       key = key + num;
     }

     if (is_key) { // 올림수 여부
      key = key + 1;
     }

     if (key >= total) {
       key = key - total;
      is_key = true;
     } else {
       is_key = false;
     }

    data[(count-1)-i] = all[key]; // 역순으로 배열 생성.

   }

   if (is_key) { // 마지막 루프에서 올림수가 있을 경우 한자리 추가
    if (is == false) {
        alert('최고값을 넘었습니다.');
        return null;
     } else {
       data.unshift('1');
     }
   }

   return data.join(''); // , 제거하고 배열 조인.
 }

function init(str,num,is) {
   return integer2string(string2integer(str),num,is);
 }

 // 초기값 생성
var def = "000";

document.writeln(def);

 // 반복문으로 테스트
for(var i = 0; i < 1000; i++) {
   def = init(def,1,false);
   document.writeln(def);
 }

결과 : 000 001 002 003 004 005 007 008 009 00a 00b 00c 00d ................

 자바 예제 소스


String str = "0dasdweZ";
out.print(CountUtils.get(str,1,false)); // 0dasdwf0 결과


/**
 * @class CountUtils
 * @brief 숫자 , 문자열을 포함한 증가값을 생성한다.
 *
 * registered date 20101019
 * programmed by Seok Kyun. Choi. (최석균)
 * http://syaku.tistory.com
 */

package com.syaku.util;

import org.apache.commons.lang.ArrayUtils;

public class CountUtils {

  private static char number[] = {'0','1','2','3','4','5','7','8','9'};
  private static char alphabet[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
  private static char ALPHABET[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
  private static char all[] = ArrayUtils.addAll(ArrayUtils.addAll(number,alphabet),ALPHABET);
  private static int total = all.length;

  /**
  * @method : string2number(parameter)
  * @brief : 인자의 문자와 일치하는 값은 순번을 반환한다.
  * @parameter : 문자열
  * @return : int[]
  */
  public static int[] string2number(String str) {
    int chr = str.length();
    char ch[] =str.toCharArray(); 

    int[] data = { };

    for (int c = (chr-1); c >= 0; c--) {
      char s = ch[c]; // 인수 문자

      for (int i = 0; i < total; i++) {
        char key = all[i];

        // 인수의 문자와 all 배열의 문자가 일치할 경우 배열에 삽입.
        if (key == s) { data = ArrayUtils.add(data,i); }
      }

    }

    return data;
  }

  /**
  * @method : number2string(parameter1,parameter2,parameter3)
  * @brief : 숫자형으로 얻은 순번배열을 parameter2 의 값만큼 더하고 순번의 문자값을 반환한다.
  * @parameters {
        parameter : int[] 숫자형 순번배열
        parameter2 : int 카운트할 숫자값.
        parameter3 : boolean - true 최고 값을 넘을 경우 예외처리함 , false 반올림처리함.
      }
  * @return : String 숫자형 순번배열의 순번 위치의 문자열을 조합하여 반환함.
  */
  public static String number2string(int[] array,int num,boolean asc) {
    int count = array.length;
    boolean is_key = false;
    char data[] = new char[count];


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

      int key = array[i];

      if (i == 0) { // 첫번째 배열에 인수의 값을 더함.
        key = key + num;
      }

      if (is_key) { // 올림수 여부
        key = key + 1;
      }
      

      if (key >= total) {
        key = key - total;
        is_key = true;
      } else {
        is_key = false;
      }

    data[(count-1) - i] = all[key]; // 역순으로 배열 생성.

    }


    if (is_key) { // 마지막 루프에서 올림수가 있을 경우 한자리 추가
      if (asc == false) {
         return null;
      } else {
        ArrayUtils.add(data,0,'1');
      }
    }

    // , 제거하고 배열 조인.
    String ret = ArrayUtils.toString(data);
    return ret.replaceAll("[{},]",""); 
  }

  /**
  * @method : get(parameter1,parameter2,parameter3)
  * @brief : 배열을 사용하여 오름 카운트를 구현함.
  * @parameters {
        parameter : 문자열
        parameter2 : int 카운트할 숫자값.
        parameter3 : boolean - true 최고 값을 넘을 경우 예외처리함 , false 반올림처리함.
      }
  * @return : String 숫자형 순번배열의 순번 위치의 문자열을 조합하여 반환함.
  */
  public static String get(String str,int num,boolean asc) {
    int data[] = string2number(str);
    return number2string(data,num,asc);
  }

}





List of Articles
번호 제목 날짜 조회 수
131 자바 대소문자 확인하는 방법 file 2023.02.15 130
130 HashMap 사용하기 file 2021.03.31 134
129 [객체 지향 언어의 이해] 업캐스팅과 다운캐스팅 file 2021.03.31 157
128 쓰레드 (Thread) 사용하기 file 2021.03.31 104
127 TCP 소켓 프로그래밍 01 - Server/Client 일대일 연결 file 2021.03.31 119
126 자바 String Class 문자열 처리 함수에 대한 정리 2021.03.31 106
125 자바 - 공백 문자 제거하기 (trim, replaceAll) file 2021.03.31 173
124 jstl <c:url value=""> 사용시 ;jsessionid= 붙는 현상 file 2021.03.31 228
123 Reflection을 활용한 메서드, 필드 값 불러오기. 2021.03.31 122
122 java에서 이전 URL 알아내기 2021.03.25 689
121 log4j에서 로그가 출력되지 않는 문제 수정 2021.03.25 405
120 Gmail 메일 서버를 이용해서 메일 보내기 file 2020.06.29 256
119 사용자의 IP를 가져오기 (IPv4) 2020.06.29 1693
118 XML to JSON , JSON to Map 2020.06.29 262
117 국제 시간에 따른 날짜 출력 2020.06.29 121
116 자바 랜덤 함수(Java random) file 2019.03.05 766
115 이클립스에서 같은 파일을 여러 편집창으로 띄우기 file 2019.03.05 677
114 이클립에서 FTP 접속하면서 Operation failed. File system input or output error 가 날때 file 2019.03.05 878
113 이클립에서 Javadoc 생성시 unmappable character for encoding MS949 에러가 발생할때 file 2019.03.05 730
112 이클립스 html, js 등등의 파일에서 에러표시 지우기 2019.03.05 1445
Board Pagination Prev 1 2 3 4 5 6 7 8 Next
/ 8

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved