2021-02-04-TIL
2021-02-04-TIL
skija
타입스크립트 추천
Skija는 Chrome과 Android가 쓰는 2D 그래픽 라이브러리 Skia의 Java 바인딩이다. AWT의 Graphics보다 현대적인 렌더링(안티앨리어싱, GPU 가속)을 Java에서 쓰고 싶을 때 후보가 된다.
Using streams to manipulate a String in Java
Using Java 8 Streams replace Characters in a String if found in a list of Characters
문자열을 스트림으로 다루려면 String.chars()로 IntStream을 얻어 각 문자를 코드 값으로 처리한 뒤 다시 모은다. 특정 문자 목록에 들어 있는 문자를 바꾸는 경우라면 목록을 Set<Character>로 만들어 두고 map에서 포함 여부를 검사한다. 다만 단순 치환은 String.replace()나 정규식 replaceAll("[abc]", "")이 더 짧고 읽기 쉬워서, 스트림은 문자마다 조건이 복잡할 때 쓰는 편이 낫다.
1
2
3
4
Set<Character> targets = Set.of('a', 'e');
String result = "banana tree".chars()
.mapToObj(c -> targets.contains((char) c) ? "*" : String.valueOf((char) c))
.collect(Collectors.joining()); // "b*n*n* tr**"
How to get HTTP Response Header in Java
HttpURLConnection(URLConnection)으로 요청을 보낸 뒤 getHeaderFields()를 부르면 응답 헤더 전체를 Map<String, List<String>>으로 받는다. 같은 이름의 헤더가 여러 번 올 수 있어서 값이 리스트다. 특정 헤더 하나는 getHeaderField("Content-Length")로 꺼낸다.
https://mkyong.com/java/how-to-get-http-response-header-in-java/
Map 데이터 전부 가져오기
Map의 모든 키-값 쌍을 순회할 때는 keySet()으로 키를 돌며 get()을 부르기보다 entrySet()을 순회하는 편이 조회를 한 번 덜 한다. Java 8부터는 map.forEach((k, v) -> ...)도 쓸 수 있다.
https://jang8584.tistory.com/271
Java program to convert a Set to an array
Set을 배열로 바꾸려면 set.toArray(new String[0])처럼 타입이 있는 배열을 넘긴다. 인자 없는 toArray()는 Object[]를 돌려주므로 캐스팅이 필요하다. 원시 타입 배열(int[])이 필요하면 set.stream().mapToInt(Integer::intValue).toArray()를 쓴다.
https://www.tutorialspoint.com/Java-program-to-convert-a-Set-to-an-array
Sorting with Comparable and Comparator in Java
Comparable은 클래스 스스로 자연 순서를 정의하는 인터페이스로 compareTo()를 구현한다. Comparator는 클래스 밖에서 정렬 기준을 따로 정의하며 compare()를 구현한다. 한 클래스에 정렬 기준이 하나면 Comparable, 상황에 따라 여러 기준이 필요하거나 수정할 수 없는 클래스를 정렬해야 하면 Comparator를 쓴다. Java 8의 Comparator.comparing(Person::getAge).thenComparing(Person::getName)처럼 기준을 조합할 수도 있다.
https://www.infoworld.com/article/3323403/java-challengers-5-sorting-with-comparable-and-comparator-in-java.html
PriorityQueue in Java
PriorityQueue는 우선순위 힙으로 구현된 큐다. 자연 순서(또는 생성자에 넘긴 Comparator)상 가장 작은 원소가 머리에 오며, Javadoc에 따르면 offer, poll, add, remove()는 O(log n), peek은 상수 시간이다. 반복자(iterator)로 순회하면 우선순위 순서가 보장되지 않으므로 정렬된 순서가 필요하면 poll()로 하나씩 꺼내야 한다. 최대 힙이 필요하면 new PriorityQueue<>(Comparator.reverseOrder())로 만든다.
- https://www.geeksforgeeks.org/priority-queue-class-in-java-2/
- http://asuraiv.blogspot.com/2015/11/java-priorityqueue.html
프린터 문제
인쇄 대기열에서 맨 앞 문서보다 중요도가 높은 문서가 뒤에 있으면 맨 앞 문서를 다시 맨 뒤로 보내는 규칙으로, 특정 문서가 몇 번째로 인쇄되는지 구하는 문제다. 대기열은 일반 큐로 두고, 남은 문서 중 최대 중요도는 PriorityQueue(최대 힙)로 관리하면 매번 전체를 훑지 않고 비교할 수 있다.
https://ju-nam2.tistory.com/38
AWT로 그래프 그리기
Draw a line with a thickness in AWT
Graphics의 drawLine()은 굵기를 지정할 수 없다. Graphics2D로 캐스팅한 뒤 setStroke(new BasicStroke(5))로 선 굵기를 정하고 그린다.
https://www.rgagnon.com/javadetails/java-0260.html
Draw a Pie chart with AWT in Java
원형 차트는 fillArc(x, y, w, h, 시작각, 호의각도)로 각 항목의 비율만큼 각도를 나눠 부채꼴을 채워 그린다. 이전 항목이 끝난 각도를 다음 항목의 시작각으로 넘기면 된다.
https://stackoverflow.com/questions/62374617/trying-to-draw-a-pie-chart-with-awt-in-java
Draw a Bar chart with Swing in Java
막대 차트는 값의 최댓값을 기준으로 막대 높이를 비율로 계산해 fillRect()로 그린다. 화면 좌표는 y축이 아래로 증가하므로 막대의 y 시작점은 바닥 - 높이로 계산해야 한다.
https://www.javacodex.com/Graphics/Bar-Chart
JFreeChart
차트를 직접 그리기 번거로우면 JFreeChart 같은 라이브러리를 쓴다. 원형, 막대, 선 그래프 등을 데이터셋만 넣어 만들고 Swing 컴포넌트(ChartPanel)로 붙이거나 이미지로 저장할 수 있다.
https://zetcode.com/java/jfreechart/
Combination and Permutation in Java
순열은 n개 중 r개를 순서를 고려해 뽑는 경우, 조합은 순서를 고려하지 않고 뽑는 경우다. 코드로는 재귀와 방문 배열(순열)이나 시작 인덱스(조합)를 넘기는 백트래킹으로 모든 경우를 만든다. 개수만 필요하면 nPr = n! / (n-r)!, nCr = n! / (r!(n-r)!) 공식으로 계산하되, 팩토리얼은 금방 long 범위를 넘으므로 파스칼의 삼각형(nCr = n-1Cr-1 + n-1Cr)으로 구하는 편이 안전하다.
https://www.tutorialspoint.com/permutation-and-combination-in-java
댓글
아직 댓글이 없습니다