원하는 날짜 포맷(yyyyMMdd,yyyyMMddHH 등)을 입력하여 현재날짜를 출력합니다.

  public static String getCurrent(String format) {
    SimpleDateFormat sdf = new SimpleDateFormat(format);
    return sdf.format(Calendar.getInstance().getTimeInMillis());
  }

 

 

댓글을 달아 주세요

 

아래 사이트 참고하여 작성한 코드입니다.

 

정렬알고리즘(sorting algorithm) 정리

1.버블정렬(Bubble sort)

medium.com

	public static void main(String[] args) {
		int arr[] = {41,34,6,16,38,36,28,19,45,43,49};
		for (int i : mergeSort(arr)){
			System.out.print(i +" ");
		}
	}
	
	/**
 	* 버블정렬
 	*  
 	*/
	public static int[] bubbleSort(int[] arr){
		for(int i=arr.length-1; i>0; i--){
			for(int j=0; j<i; j++){
				if (arr[j] > arr[j+1]){
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
		return arr;
	}
		
	/**
 	* 선택정렬
 	*  
 	*/
	public static int[] selectionSort(int[] arr){
		for(int i=0; i<arr.length; i++){
			int min = arr[i];
			for(int j=i+1; j<arr.length; j++){
				if(min > arr[j]){
					min = arr[j];
					arr[j] = arr[i];
					arr[i] = min;
				}
			}
		}
		return arr;
	}
		
	/**
 	* 삽입정렬
 	*  
 	*/
	public static int[] insertionSort(int[] arr){
		for(int i=1; i<arr.length; i++){
			for(int j=i; j>0; j--){
				if(arr[j] < arr[j-1]){
					int tmp = arr[j];
					arr[j] = arr[j-1];
					arr[j-1] = tmp;
				}
			}
		}
		return arr;
	}
		
	/**
 	* 병합정렬
 	*  
 	*/
	public static int[] mergeSort(int[] arr){
		System.out.println("before");
		for(int i : arr){
			System.out.print(i + " ");
		}		
		System.out.println();
		
		if (arr.length < 2){
			return arr;
		}
		
		int mid = arr.length / 2;
		int[] leftArr = mergeSort(Arrays.copyOfRange(arr, 0, mid));
		int[] rightArr = mergeSort(Arrays.copyOfRange(arr, mid, arr.length));
		int[] mergedArr = new int[arr.length];
		int m = 0, l = 0, r = 0;
		while (l < leftArr.length && r < rightArr.length) {
			if (leftArr[l] < rightArr[r]) {
				mergedArr[m++] = leftArr[l++];
			} else {
				mergedArr[m++] = rightArr[r++];
			}
		}
		while (l < leftArr.length) {
			mergedArr[m++] = leftArr[l++];
		}
		while (r < rightArr.length) {
			mergedArr[m++] = rightArr[r++];
		}
		System.out.println("after");
		for(int i : mergedArr){
			System.out.print(i + " ");
		}		
		System.out.println();
		return mergedArr;
	}

 

 

댓글을 달아 주세요

 

 

	private static boolean isBlank(String str) {
		int strLen; if (str == null || (strLen = str.length()) == 0) {
			return true; 
		} 
		for (int i = 0; i < strLen; i++) {
			if ((!Character.isWhitespace(str.charAt(i)))) {
				return false; 
			} 
		} 
		return true; 
	}

 

 

댓글을 달아 주세요

 

휴대폰 번호를 asterisk(*)로 암호화하는 코드입니다.

	/**
	 * encrypt number in text
	 * 
	 * maskingCallNumber
	 *  
	 * @param str
	 * @return String
	 */
	public static String maskingCallNumber(String str){
		String replaceString = str;
		String matchedStr ="";

		String pattern ="(\\d{2,3})-?(\\d{3,4})-?(\\d{3,4})";
		Matcher matcher = Pattern.compile(pattern).matcher(str);

		if(matcher.find()){
			StringBuffer br = new StringBuffer();
			for(int i = 1 ; i<=matcher.groupCount(); i++){
				matchedStr = matcher.group(i);
				for(int j = 0 ; j <matchedStr.length();j++){
					br.append("*");
				}
				if(i !=matcher.groupCount()){
					br.append("-");
				}
			}
			replaceString =matcher.replaceAll(br.toString());
		}
		return replaceString;
	}

 

 

댓글을 달아 주세요

 

이름을 asterisk(*)로 암호화하는 코드입니다.

	/**
	 * maskingName
	 *  
	 * @param str
	 * @return String
	 */
	public static String maskingName(String str) {
		String replaceString = str;

		String pattern = "";
		if(str.length() == 2) {
			pattern = "^(.)(.+)$";
		} else {
			pattern = "^(.)(.+)(.)$";
		}

		Matcher matcher = Pattern.compile(pattern).matcher(str);

		if(matcher.matches()) {
			replaceString = "";

			for(int i=1;i<=matcher.groupCount();i++) {
				String replaceTarget = matcher.group(i);
				if(i == 2) {
					char[] c = new char[replaceTarget.length()];
					Arrays.fill(c, '*');

					replaceString = replaceString + String.valueOf(c);
				} else {
					replaceString = replaceString + replaceTarget;
				}

			}
		}
		return replaceString;
	}

 

 

댓글을 달아 주세요

 

 

   /**
    * 날짜 더하기
    * 
    * @param dataeFormat yyyyMMdd ..
    * @param strDate 20190612 ..
    * @param dateUnit DATE or HOUR
    * @param addDate 1, -1 ...
    * @return
    */
   public static String dateAdd(String dataeFormat, String strDate, String dateUnit, int addDate) {
       DateFormat dateFormat = null;
       Date date = new Date();
       
       try {
           dateFormat = new SimpleDateFormat(dataeFormat);
           date = dateFormat.parse(strDate);
       } catch (ParseException e) {
    	   EDWLogger.error(CommonUtil.class, e.getMessage());
       }
       
       Calendar cal = Calendar.getInstance();
       cal.setTime(date);
       if ("DATE".equals(dateUnit)) {
           cal.add(Calendar.DATE, addDate);
       } else if ("HOUR".endsWith(dateUnit)) {
           cal.add(Calendar.HOUR, addDate);
       } 
       return dateFormat.format(cal.getTime());
   }

 

 

댓글을 달아 주세요

 

두가지 방식 있습니다. 상황에 따라 사용하시면 되겠습니다.

 

1.

String command = "ls";
new ProcessBuilder("/bin/bash", "-c", command).start();

2.

    /**
     * cmd 명령어 실행
     *
     * @param cmd
     */
    public static boolean executeCmd(String cmd) {
        Process process = null;
        Runtime runtime = Runtime.getRuntime();
        StringBuffer successOutput = new StringBuffer();
        StringBuffer errorOutput = new StringBuffer();
        BufferedReader successBufferReader = null;
        BufferedReader errorBufferReader = null;
        String msg = null;
        boolean result = false;
 
        List<String> cmdList = new ArrayList<String>();
 
        cmdList.add("/bin/sh");
        cmdList.add("-c");
        
        cmdList.add(cmd);
        String[] array = cmdList.toArray(new String[cmdList.size()]);
 
        try {
        	Logger.info(CommonUtil.class, "cmd : " + cmd);
            process = runtime.exec(array);
 
            successBufferReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "EUC-KR"));
 
            while ((msg = successBufferReader.readLine()) != null) {
                successOutput.append(msg + System.getProperty("line.separator"));
            }
 
            errorBufferReader = new BufferedReader(new InputStreamReader(process.getErrorStream(), "EUC-KR"));
            while ((msg = errorBufferReader.readLine()) != null) {
                errorOutput.append(msg + System.getProperty("line.separator"));
            }
 
            process.waitFor();
 
            if (process.exitValue() == 0) {
                result = true;
            } else {
                Logger.error(CommonUtil.class, "abnormal finish error : " + successOutput.toString());
            }
 
            if (isNotBlank(errorOutput.toString())) {
                Logger.error(CommonUtil.class, "error : " + successOutput.toString());
            }
 
        } catch (IOException e) {
            Logger.error(CommonUtil.class, e.getMessage());
        } catch (InterruptedException e) {
            Logger.error(CommonUtil.class, e.getMessage());
        } finally {
            try {
                process.destroy();
                if (successBufferReader != null) successBufferReader.close();
                if (errorBufferReader != null) errorBufferReader.close();

            } catch (IOException e1) {
                Logger.error(CommonUtil.class, e1.getMessage());
            }
        }
        return result;
    }

댓글을 달아 주세요

 

자바 date(날짜) 포맷 별 정규식입니다.

public static final String YYYYMMDD = "(19|20)\\d{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])";
public static final String YYYYMMDDHH = "(19|20)\\d{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])(0[0-9]|1[0-9]|2[0-3])";
public static final String YYYYMMDDHHMI = "(19|20)\\d{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])(0[0-9]|1[0-9]|2[0-3])([0-5][0-9])";
public static final String YYYYMMDDHHMISS = "(19|20)\\d{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])(0[0-9]|1[0-9]|2[0-3])([0-5][0-9])([0-5][0-9])";
public static final String HH= "(0[0-9]|1[0-9]|2[0-3])";
public static final String MMDD = "(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])";
public static final String HHMI = "(0[0-9]|1[0-9]|2[0-3])([0-5][0-9])";

 

*정규식 해석 (ex : yyyyMMdd)

 - (19|20) :  19 또는 20로 year 앞 2자 표현

 - \\d{2} : 2자리 숫자(00~99 까지) year 뒤 2자 표현

 - (0[1-9]|1[012]) : 0과 1~9에서 1개 또는 1과 012에서 1개로 month 2자 표현

 - (0[1-9]|[12][0-9]|3[01]) : 0과 1~9 또는 1,2와 0~9 또는 3과 0,1로 day 2자 표현

 

 

 

- 위 정규식 사용하여 문자열에서 특정 패턴의 date 검출하는 방법

2016/06/20 - [Programming/JAVA] - [JAVA] 문자열에서 date 특정 패턴 가져오기

 

 

댓글을 달아 주세요

 

my problem

FileInputStream fin = null;
BufferedInputStream bis = null;
GzipCompressorInputStream gzIn = null;
TarArchiveInputStream tarIn = null;
InputStreamReader is = null;
BufferedReader br = null;

fin = new FileInputStream();                
bis = new BufferedInputStream(fin);
tarIn = new TarArchiveInputStream(bis);
is = new InputStreamReader(tarIn, "UTF-8");
br = new BufferedReader(is);
ArchiveEntry entry = null;

while ((entry = tarIn.getNextEntry()) != null) {                                
    if (entry.isDirectory()) {
    } else {
    }
}

-> java.io.IOException: Error detected parsing the header

 

 

solution

FileInputStream fin = null;
BufferedInputStream bis = null;
GzipCompressorInputStream gzIn = null;
TarArchiveInputStream tarIn = null;
InputStreamReader is = null;
BufferedReader br = null;

fin = new FileInputStream();                
bis = new BufferedInputStream(fin);
gzIn = new GzipCompressorInputStream(bis); //추가
tarIn = new TarArchiveInputStream(gzIn);   //변경
is = new InputStreamReader(tarIn, "UTF-8");
br = new BufferedReader(is);
ArchiveEntry entry = null;

while ((entry = tarIn.getNextEntry()) != null) {                                
    if (entry.isDirectory()) {
    } else {
    }
}

 

 

댓글을 달아 주세요

 

문자열에서 특정 패턴의 date 검출하는 방법

 

ex) 문자열에서 정규식을 이용하여 Date yyMMdd 형태의 패턴 검출

String yyMMdd = "(19|20)\\d{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])";
String date = "20160620date";

Pattern pattern = Pattern.compile(yyMMdd);
Matcher matcher = pattern.matcher(date);
  
while(matcher.find()){
    src = matcher.group();
}

System.out.println("src: " + src);

결과 값 : 20160620

 

 

댓글을 달아 주세요

 

안녕하세요.

괄호, 사칙연산 우선순위 처리하는 계산기 소스 공유합니다.

 

계산기 프로그램을 만들 때 많이 고민을 하게 되는데요. 

후위표기법과 Stack에 대해서 공부를 좀 하시면 해결하실 수 있을거에요.

 

괄호와 사칙연산 우선순위 계산을 처리하기 위해 후위 표기법 방식을 사용했습니다.

다른 방법도 있겠지만 대중적으로 많이 사용하는 방식입니다.

 

허접한 소스지만 공유해드려요.

package test;

import java.util.ArrayList;
import java.util.Stack;

/**
 * 계산 서비스
 * 
 * @author
 * @version
 * @since
 * @created 2015. 1. 12.
 */
public class CalculatorService {

    public static void main(String[] args) {

        String result = getCalculate("(10 + 20) * 10");
        System.out.println(result);
    }

    /**
     * 계산처리
     */
    private static String getCalculate(String content) {

        char[] operationCode = {'+', '-', '*', '/', '(', ')'}; //연산 부호

        ArrayList<String> postfixList = new ArrayList<String>(); //후위표기법으로 변환 후 저장 할 ArrayList
        Stack<Character> opStack = new Stack<Character>(); // 연산 부호 우선순위처리 하며 후위 표기법으로 변경하는 Stack
        Stack<String> calculatorStack = new Stack<String>(); //후위 표기법을 계산하는 Stack

        int index = 0;//content.substring() 인수

        for (int i = 0; i < content.length(); i++) {
            for (int j = 0; j < operationCode.length; j++) {
                if (content.charAt(i) == operationCode[j]) { //문자열과 연산 부호 비교

                    //postfixList에 연산 부호가 나오기 전까지의 숫자를 담는다(공백제거)
                    postfixList.add(content.substring(index, i).trim().replace("(", "").replace(")", ""));
                    if (content.charAt(i) == '(') {
                        if (content.charAt(i) == ')') {//우 괄호가 나오면 좌 괄호가 나오거나 스택에 비어있을때 까지 pop하여 list에 저장
                            while (true) {
                                postfixList.add(opStack.pop().toString());
                                if (opStack.pop() == '(' || opStack.isEmpty()) {
                                    break;
                                }
                            }
                        }
                    }

                    if (opStack.isEmpty()) { //opStack이 비어 있을 경우
                        opStack.push(operationCode[j]); //연산 부호 저장
                    } else { //opStack이 비어 있지 않을 경우
                        if (opOrder(operationCode[j]) > opOrder(opStack.peek())) { //우선 순위 비교
                            opStack.push(operationCode[j]); //스택에 top 값 보다 높은 우선순위이면 그대로 저장
                        } else if (opOrder(operationCode[j]) <= opOrder(opStack.peek())) {//우선 순위 비교
                            postfixList.add(opStack.peek().toString());//스택에 있는 값이 우선순위가 같거나 작을 경우 list에 저장
                            opStack.pop();//스택 제거
                            opStack.push(operationCode[j]);//높은 우선순위 연산 부호 스택에 저장
                        }
                    }
                    index = i + 1;// 다음 순서 처리
                }
            }
        }
        postfixList.add(content.substring(index, content.length()).trim().replace("(", "").replace(")", "")); //마지막 숫자 처리

        if (!opStack.isEmpty()) { //Stack에 남아있는 연산 모두 postfixList에 추가
            for (int i = 0; i < opStack.size();) {
                postfixList.add(opStack.peek().toString());
                opStack.pop();
            }
        }

        //list에 공백, 괄호 제거
        for (int i = 0; i < postfixList.size(); i++) {
            if (postfixList.get(i).equals("")) {
                postfixList.remove(i);
                i = i - 1;
            } else if (postfixList.get(i).equals("(")) {
                postfixList.remove(i);
                i = i - 1;
            } else if (postfixList.get(i).equals(")")) {
                postfixList.remove(i);
                i = i - 1;
            }
        }

        System.out.println(postfixList);

        opStack.clear(); //Stack 비우기

        //postfixList를 calculatorStack에 저장하면서 후위연산 처리
        for (int i = 0; i < postfixList.size(); i++) {
            calculatorStack.push(postfixList.get(i));
            for (int j = 0; j < operationCode.length; j++) {
                if (postfixList.get(i).charAt(0) == operationCode[j]) { //연산 부호 비교
                    calculatorStack.pop(); //stack에 저장된 연산 부호 제거
                    double s2, s1; //stack에서 pop 되는 값들을 저장할 변수
                    String rs; // 연산 처리 후 문자열로 변환 후 stack에 저장할 변수

                    s2 = Double.parseDouble(calculatorStack.pop()); //스택에서 pop하여 문자열을 숫자로 형변환
                    s1 = Double.parseDouble(calculatorStack.pop());

                    //연산 부호에 해당하는 산술 처리 후 stack에 저장
                    switch (operationCode[j]) {
                        case '+':
                            rs = String.valueOf(s1 + s2);
                            calculatorStack.push(rs);
                            break;
                        case '-':
                            rs = String.valueOf(s1 - s2);
                            calculatorStack.push(rs);
                            break;
                        case '*':
                            rs = String.valueOf(s1 * s2);
                            calculatorStack.push(rs);
                            break;
                        case '/':
                            rs = String.valueOf(s1 / s2);
                            calculatorStack.push(rs);
                            break;
                    }
                }
            }
        }

        double re = Double.parseDouble(calculatorStack.peek()); //Stack Top 데이터 
        String result = String.format("%.10f", re); //소수점 10째짜리

        //정수 부분 자리 구하기
        int num = 0;
        for (int i = 0; i < result.length(); i++) {
            if (result.charAt(i) == '.') {
                num = i;
                break;
            }
        }

        //정수부분
        String mok = result.substring(0, num);

        //나머지 연산
        double divde = Double.parseDouble(result) % Double.parseDouble(mok);

        //나머지가 0이면 소수점 자릿 수 안보이게
        if (divde == 0) {
            result = String.format("%.0f", re);
        }

        return result;
    }

    /**
     * 연산 부호 우선순위 정하는 메서드
     * 
     * @param op - 연산 부호
     */
    public static int opOrder(char op) {
        switch (op) {
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 2;
            default:
                return -1;
        }
    }

}

 

 

계산 결과

[10, 20, +, 10, *]
300

 

 

댓글을 달아 주세요

 

 

List<String> list = new ArrayList<String>();

list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");

Collections.shuffle(list); // num 값들 랜덤으로 순서 재배치

for (int i = 0; i < list.size(); i++) {
	System.out.println(list.get(i));
}

 

Collections을 이용해서 간단하게 처리 할 수 있습니다.

 

 

댓글을 달아 주세요

 

안녕하세요.

List를 사용할 때 중복된 내용을 제거하는 방법에 대해 알아보겠습니다.

public static void main(String[] args) {
	List<String> list = new ArrayList<String>();
	list.add("1");
	list.add("1");
	list.add("2");
	list.add("2");
	list.add("3");
	list.add("4");
	list.add("5");

	//중복된 내용 제거
	//hashSet - 중복제거, LinkedHashSet - 중복제거,정렬
	List<String> duplicateRemoveList = new ArrayList<String>(new LinkedHashSet<String>(list));

	for (int i = 0; i < duplicateRemoveList.size(); i++) {
		System.out.println(duplicateRemoveList.get(i));
	}
}

hashSet과 LinkedHashSet 모두 중복되는 내용을 제거 할 수 있지만 차이는 정렬이 되느냐 안되느냐에 있습니다.

 

 

댓글을 달아 주세요