문자 출현빈도 추출하기

문자 출현빈도 추출하기

소스코드

package study.logic;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


/**
 * 입력된 문자열에서 각 문자의 출현개수 카운트
 */
public class CharacterCount {

	public CharacterCount() {
	}


	/***
	 * 각 문자의 출현 횟수를 기록/반환
	 *
	 * @param inputText
	 * @return
	 */
	public Map<String, Integer> count( String inputText ) {
		Map<String, Integer> counts = new HashMap<>();

		if( inputText != null && inputText.length() > 1 ) {
			for( String s : inputText.split( "" ) ) {
				if( counts.containsKey( s ) ) {
					counts.put( s, counts.get( s ) + 1 );

				} else {
					counts.put( s, 1 );
				}
			}
		}

		return counts;
	}


	/**
	 * 각 문자별 오름차순으로 정렬하여 한줄씩 이쁘게 출력
	 *
	 * @param map
	 */
	public void printMapOrderByKey( Map<String, Integer> map ) {
		List<String> keys = new ArrayList<>();
		keys.addAll( map.keySet() );

		keys.sort( new Comparator<String>() {

			@Override
			public int compare( String left, String right ) {
				return left.compareTo( right );
			}

		} );

		for( String k : keys ) {
			System.out.println( k + " : " + map.get( k ) );
		}
	}


	/**
	 * 각 문자의 출현 빈도순 내림차순으로 정렬하여 한줄씩 이쁘게 출력
	 * ※ 빈도가 동일한 경우 문자의 오름차순으로 정렬
	 *
	 * @param map
	 */
	public void printMapOrderByCount( Map<String, Integer> map ) {
		List<Entry<String, Integer>> elements = new ArrayList<>();
		elements.addAll( map.entrySet() );

		elements.sort( new Comparator<Entry<String, Integer>>() {

			@Override
			public int compare( Entry<String, Integer> left, Entry<String, Integer> right ) {
				if( left.getValue() == right.getValue() ) {
					return left.getKey().compareTo( right.getKey() );
				} else {
					return right.getValue() - left.getValue();
				}
			}

		} );

		for( Entry<String, Integer> e : elements ) {
			System.out.println( e.getKey() + " : " + e.getValue() );
		}
	}


	public static void main( String[] args ) {
		String inputText = "ABDFEFAD3FEYT7ALA2SFEHJFA8SLDKJ3FHAKEJ8UF5GZZ3ZQ2QE76TY7U8JUXD1JFHQEEIJFA";
		CharacterCount counter = new CharacterCount();

		System.out.println( "문자 오름차순 정렬 =================== " );
		counter.printMapOrderByKey( counter.count( inputText ) );
		System.out.println( "\n\n" );

		System.out.println( "빈도 내림차순 정렬, 중복시 문자 오름차순 정렬 =================== " );
		counter.printMapOrderByCount( counter.count( inputText ) );
	}

}

실행결과

문자 오름차순 정렬 =================== 
1 : 1
2 : 2
3 : 3
5 : 1
6 : 1
7 : 3
8 : 3
A : 7
B : 1
D : 4
E : 7
F : 9
G : 1
H : 3
I : 1
J : 6
K : 2
L : 2
Q : 3
S : 2
T : 2
U : 3
X : 1
Y : 2
Z : 3



빈도 내림차순 정렬, 중복시 문자 오름차순 정렬 =================== 
F : 9
A : 7
E : 7
J : 6
D : 4
3 : 3
7 : 3
8 : 3
H : 3
Q : 3
U : 3
Z : 3
2 : 2
K : 2
L : 2
S : 2
T : 2
Y : 2
1 : 1
5 : 1
6 : 1
B : 1
G : 1
I : 1
X : 1

Written with StackEdit.