Til Home

2020-06-15-TIL

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

+@ 외부 자료 https://medium.com/@chrisjune_13837/%EC%A0%95%EA%B7%9C%EC%8B%9D-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-%EC%98%88%EC%A0%9C%EB%A5%BC-%ED%86%B5%ED%95%9C-cheatsheet-%EB%B2%88%EC%97%AD-61c3099cdca8

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

  • 알고리즘 잣밥 탈출 하기위해서 알고리즘 다른 사람 풀이를 보면서 공부 하고 많이 풀어보면서 익숙해지도록 하자.