Problem Solving

[Java] Requirements Q114: HashMap 확장자별 카운트

Isaac S. Lee 2023. 8. 8. 10:49

📌리소스

 

📌Q114 Class

import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Set;

public class Q114 {

	public static void main(String[] args) {
		/*
		● 요구사항
		이미지 파일이 있다. 확장자별로 파일이 몇개 있는지 세시오.
		
		● 조건
		- 새로운 확장자 파일이 추가되도 동작이 가능하게 구현하시오.
		- 'mouse.bmp' 추가를 하면.. 소스 수정 없이도 *.bmp : 1개 출력이 되게 하시오.
		
		● 리소스
		- 폴더 > 확장자별 카운트
		- 파일 다운로드
		
		● 출력
		.gif: 10개 
		.jpg: 5개 
		.png: 3개 

		// HashMap<String,Integer>를 이용한다.
		*/
		
		String path = "C:\\Class\\code\\java\\file\\파일_디렉토리_문제\\확장자별 카운트";
		
		// 파일 목록 불러오기
		File dir = new File(path);
		
		// 키 > 확장자
		// 값 > 카운트
		HashMap<String,Integer> count = new HashMap<String,Integer>();
		
		File[] list = dir.listFiles();
		
		/*
		// 파일이 정상적으로 들어왔는지 확인
		for (File file : list) {
			System.out.println(file.getName());
		}
		*/
		
		for (File file : list) {
			
			String extension = getExtension(file.getName());
			
			/*
			if (확장자가 맵에 존재) {
				count.put(extension, 1); // 새로운 확장자 등록
			} else {
				count.put(extension, count.get(extension) + 1); // count = count + 1 누적
			}
			*/
			if (count.get(extension) == null) {
				count.put(extension, 1);
			} else {
				count.put(extension, count.get(extension) + 1);
			}
		}

		// System.out.println(count);
		
		Set<String> keys = count.keySet();
		
		for (String key : keys) {
			System.out.printf("*.%s: %d개\n", key, count.get(key));
		}
	}
	
	private static String getExtension(String name) {
		
		/*
		String[] temp = name.split(".");
		System.out.println(temp.length); // 0
		
		// 왜 length가 0으로 나오는가?
		// "."으로 쪼개지 못했기 때문이다. "\\."으로 작성해 주어야 한다. [ 정규표현식 ]
		*/
		
		String[] temp = name.split("\\.");
		String ext = temp[temp.length - 1].toLowerCase();
		// file.getName().substring(file.getName().lastIndexOf(".") + 1;
		
		// System.out.println(Arrays.toString(temp));
		// System.out.println(ext);
		
		return ext;
	}
}

 

버그 픽스

length가 0이 되는 버그

// String[] temp = name.split(".");
String[] temp = name.split("\\.");

"."으로 split 하면 결과가 제대로 나오지 않는다. split이 발생하지 않았기 때문이다.

정규표현식으로 "\\."으로 split을 해야 한다.