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 {

    }

}

 

블로그 이미지

Heum's

IT 관련 지식 공유

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

 

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

 

블로그 이미지

Heum's

IT 관련 지식 공유


안녕하세요.

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


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

후위표기법과 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



블로그 이미지

Heum's

IT 관련 지식 공유

 

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을 이용해서 간단하게 처리 할 수 있습니다.

 

 

블로그 이미지

Heum's

IT 관련 지식 공유

 

안녕하세요.

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 모두 중복되는 내용을 제거 할 수 있지만 차이는 정렬이 되느냐 안되느냐에 있습니다.

 

 

블로그 이미지

Heum's

IT 관련 지식 공유