arctGr
21
2021-04-15 13:10:26 작성 2021-04-19 15:55:02 수정됨
12
273

비공개


감사합니다

1
  • 답변 12

  • 야근그만
    195
    2021-04-15 13:16:18

    https://ssamdu.tistory.com/7

  • BalanceE
    420
    2021-04-15 14:02:47

    정렬이 name asc, depth asc 멀티 정렬이네요


    List<DTO> itemList = new ArrayList<>();
    ..
    add list
    ...
    
    //sort list
    List<DTO> sortList = itemList.stream()
    .sorted(Comparator.comparing(DTO::getName))
    .sorted(Comparator.comparing(DTO::getDepth))
    .collect(Collectors.toList());

    단, 해당 방식은 stream으로 Java 1.8이후 부터 사용가능합니다.

    그리고 DTO의 클래스는 getter/setter가 명시되어있다는 기준입니다.

  • 카스마당
    1k
    2021-04-15 14:31:49

    하위버전 에서는..

    https://offbyone.tistory.com/154

  • 해리아범
    139
    2021-04-15 14:38:11

    이거 정렬이 아니라 DFS(깊이 우선 탐색)을 원하는 걸로 보이는데요


  • 야근그만
    195
    2021-04-15 14:52:39
    아 그렇네요 해리아범님 말씀대로 깊이 우선 탐색이네요 단순히 정렬이라고해서 ㅋ
  • BalanceE
    420
    2021-04-15 15:12:51

    이걸 DFS로 보기에는 노드 연결이 안되는것 같은데요..

    root 노드에서 1번 seq로 시작해서 parentId와 연결되는 노드의 탐색이 종료되었으면, 다음 seq의 값은 2가 되어야 하는거 아닐까요 ( 알고리즘은 얉은 지식이라 ... 정확하지 않네요 )

    parentId와 seq가 매칭이 되어야 한다고 하는데 

    {seq='11', parenId='5', name='애플', depth=3}

    {seq='12', parenId='5', name='원숭이', depth=3}

    식으로 매칭이 안되는 부분이 다수 존재합니다.

    글쓴이님이 요청한 결과는 어떠한 규칙으로 정확히 나타내어 지는것인가요?

  • BalanceE
    420
    2021-04-15 15:57:30

    야근그만 

    단순 시퀀스값으로만 비교를 해서 재귀를 하시면, 초기 root seq와 

    비교할수 있는 시퀀스 값이 없습니다. 


    그리고 글쓴이님이 seq와 parentId값을 매칭한다고 했었는데...

    ///////////////

     

    보통 SEQ값은 유니크 하며 해당 로우를 대표하는 순번으로 나타내어 지는데 SEQ값이 중복될 수 있나요?

    그러므로 초기에 말씀하신 seq값과 parentId로 매칭해서 하는 행위는 말이 안되는것 같아요

    또한 트리구조를 하기 위해서는 parentId와 Depth를 이용해야 하지 않을까요?

    데이터 구조를

    {seq='0', parenId='', name='root', depth=0} // Root

    {seq='1', parenId='0', name='과일', depth=1}  // 과일 카테고리 ( 과일의 코드값은 0 )

    {seq='5', parenId='0', name='사과', depth=2}  // 과일 소분류 상세 과일명

    {seq='11', parenId='0', name='애플', depth=2} // 과일 소분류 상세 과일명

    {seq='3', parenId='1', name='우유', depth=1} // 우유 카테고리 ( 우유의 코드값은 1 )

    {seq='8', parenId='1', name='딸기우유', depth=2} // 우유 소분류 상세 우유명

    .

    .

    .

    이런식으로 잡아서 parentId를 줘야 합니다.

    또한 depth가 3뎁스까지 있는데 3뎁스를 표현하기 위해서는 부모의 ID를 가지고 있는 자식의 ID가 따로 필요합니다.




  • 야근그만
    195
    2021-04-15 16:00:24 작성 2021-04-15 16:02:04 수정됨


    public static List<DTO> sort(String parenId, List<DTO> list){
    
    List<DTO> result = new ArrayList<>();
    
    for(DTO dto : list.stream().filter(row -> row.getParenId().equals(parenId)).collect(Collectors.toList()){
      result.add(dto);
      result.addAll(sort(dto.getSeq(),list));
    }
    return result;
    }


    List<DTO> item = sort("",list);

  • 야근그만
    195
    2021-04-15 16:13:20 작성 2021-04-15 16:14:27 수정됨

    BalanceE

    키값이 조금 헷갈렸습니다^^;;

  • BalanceE
    420
    2021-04-15 16:15:07


    야근그만 님이 올리신 코드 대로 실행하지는 않았지만 직접 대입해보니까

    {seq='0', parenId='', name='root', depth=0}

    ------------------------------------------------------------

    {seq='1', parenId='0', name='과일', depth=1}

        {seq='5', parenId='1', name='사과', depth=2}

            {seq='11', parenId='5', name='애플', depth=3}

            {seq='12', parenId='5', name='원숭이', depth=3}

        {seq='6', parenId='1', name='배', depth=2}    

            {seq='13', parenId='6', name='배꼽', depth=3}

                {seq='15', parenId='13', name='곱창', depth=4}

        {seq='9', parenId='1', name='포도', depth=2}

    ------------------------------------------------------------

    {seq='3', parenId='0', name='우유', depth=1}

        {seq='8', parenId='3', name='딸기우유', depth=2}

    ------------------------------------------------------------

    {seq='4', parenId='0', name='국가', depth=1}

        {seq='10', parenId='4', name='한국', depth=2}

    ------------------------------------------------------------

    {seq='2', parenId='0', name='과자', depth=1}

        {seq='7', parenId='2', name='새우깡', depth=2}

            {seq='14', parenId='7', name='깡따구', depth=3}

    ------------------------------------------------------------


    순으로 나오는것 같습니다.

    글쓴이님이 말씀하신 결과랑 같고 주어진 데이터로만 트리구조가 표현이 가능하군요..

    감탄하였습니다. 


  • BalanceE
    420
    2021-04-15 16:15:48

    조금더 생각하지 않고 데이터 필드의 부족으로 결과를 단정지어 버린 제 자신이 부끄러워지는군요

  • 야근그만
    195
    2021-04-15 16:35:15 작성 2021-04-15 16:35:42 수정됨

    BalanceE

    현업에서 공통코드 관리할때 많이 쓰는 방법이죠~

    정부프레임워크에서도 장려하는 방법이고

    저도 처음에 데이터 보지도 않고 "정렬"에 꼿혀서

    정말 정렬 사용법 제시했는걸요 ㅋ

    작성자분 답답하셨을듯

    해리아범 님 아니셨으면

    저도 몰랐을꺼에요

  • 로그인을 하시면 답변을 등록할 수 있습니다.