소스코드
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.