Fact
- 아침에 알고리즘 풀지는 않았고 공부 했다. 저번주에 풀었던 문제들을 다른 사람들의 풀이를 보면서 공부 했다. 다른 사람들의 풀이를 보니 더 효율적인 방법이 많이 보여서 코드 뜯어보고 공부했다. 공부 후에 저번주에 못 풀었던 가장 먼 노드를 풀어 볼려고 했지만 집중이 안되고 의식의 흐름대로 짜다 보니 완전 이상하게 풀고 있는 나 자신을 보게 되었다. 그래서 그냥 문제 풀이를 중단 했다.
- 나중에 코어 자바 책을 다시 읽기 시작 했다. 오늘은 9장을 보면서 파일 입출력 및 정규식 대해 공부 했다.
Feelings
- 나는 알고리즘 잣밥. 다른 사람들 풀이 보면 정말 자괴감든다.
- 정규식 쓰기 너무 힘든데 한번 알고 나면 코드 짜는데 엄청 편해지는게 느껴진다.
Findings
-
Path path = Paths.get("/", "home", "cayabs"); // /home/cayabs Path workPath = path.resolve("myprog/work"); // /home/cayabs/myprog/work Path siblingPath = workPath.sibling("sib"); // /home/cayabs/myprog/sib Path siblingPath2 = path.sibling("sib"); // /home/sib //상대 경로 찾기 relativize Path relative = Paths.get("/home/cay").relativize(Paths.get("/home/fred/myprog")); // ../fred/myprog // 상대경로 다시 원래대로 바꾸기 Path normalized = Paths.get("/home/cay/../fred/./myprog").normalize();// /home/fred/myprog //절대 경로 Path absolute = Paths.get("1").toAbsolutePath();// /절/대/경/로/1 Path p = Paths.get("/home", "cay", "myprog.properties"); // /home/cay/myprog.properties Path parent = p.getParent(); // /home/cay Path file = p.getFileName(); // myprog.properties Path root = p.getRoot(); // / Path first = p.getName(0);// home Path dir = p.subpath(0, p.getNameCount() - 1); // home/cay System.out.println("Components of p"); for (Path component : p) { System.out.print(component); }// homecaymyprog.properties
파일과 디렉터리 생성
```java
//디렉터리 생성
Files.createDirectory(path);
//중간 디렉터리 또한 만들어야 할때
Files.createDirectories(path);
//빈파일 만들기
Files.createFile(path);
//지정 파일 존재 유무 검사
Files.exists(path);
//파일 이동
Files.move(원하는 파일, 어느 위치로, StandardCopyOption.ATOMIC_MOVE); // StandardCopyOption.ATOMIC_MOVE 는 원시적으로 이동한다.
// 파일 삭제
Files.delete(path);
//정규식
String regex = "[+-]?\\d+";
// [] => 괄호 안에 만족하는 글짜
// ? => 앞에 조건을 0개 혹은 1개 만족시
// \\ => 이스케이프
// d+ => 연속 되는 숫자
CharSequence input = "-123";
if (Pattern.matches(regex, input))
System.out.println(input + " is an integer"); //-123 is an integer
같은 정규식을 쓸 시에 컴파일 하면 더 효율적이라고 한다.
Pattern pattern = Pattern.compile(regex);
input = "Fred";
Matcher matcher = pattern.matcher(input);
if (!matcher.matches())
System.out.println(input + " is not an integer"); //Fred is not an integer
stream이나 collection을 쓸려면 글.asPredicate()를 써야 한다.
Stream<String> strings = Stream.of("99 bottles of beer on the wall, 99 bottles of beer.".split(" "));
Stream<String> result = strings.filter(pattern.asPredicate());
System.out.println(result.collect(Collectors.toList())); // [99, 99]
regex grouping 위에 matcher을 써서 일치 항목의 구성 요소를 추출할때 group를 쓴다. grouping을 할때 기본적으로 괄호 안에 조건들을 넣어서 지정한다.
Pattern pattern = Pattern.compile("(\\p{Alnum}+(\\s+\\p{Alnum}+)*)\\s+([A-Z]{3})([0-9.]*)");
String input = "Blackwell Toaster USD29.95";
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
String item = matcher.group(1);
String itema = matcher.group(2);
String currency = matcher.group(3);
String price = matcher.group(4);
System.out.printf("item=%s,items=%s, currency=%s,price=%s\n", item, itema, currency, price); //item=Blackwell Toaster,items= Toaster, currency=USD,price=29.95
}
//괄호 마다 하나의 그룹이라고 보면 된다. 첫번째 그룹은 \\p{Alnum}+(\\s+\\p{Alnum}+)* 이 포함되어 있고 두번째는 첫번째 그룹 안에 있는 \\s+\\p{Alnum}+다. 세번째는 [A-Z]{3}. 네번째는 [0-9.]*다.
Future Action
- 알고리즘 잣밥 탈출 하기위해서 알고리즘 다른 사람 풀이를 보면서 공부 하고 많이 풀어보면서 익숙해지도록 하자.