pictripuk
93
2015-04-04 16:13:24
4
1985

java interface hashset 관련 문의 드립니다.


컬렉션 관련 공부 하던 중에 문의 사항이 있어서 이렇게 글을 남김니다.


제가 아는 set interface 는 중복 불허, 비 정렬 인걸로 기억을 하고 있습니다.


하지만 간단한 코딩을 하다가 정렬이 되어 출력이 되어 문의 드릴려고 합니다.

단순하게 숫자를 add 하며 출력 하는 프로그램입니다.

그런대 숫자가 이상하게 오름차순으로 정렬이 되어 있더군요..

혹시 제가 알고 있던 개념이랑 다른지 혹시 좀 알려 주실분 있으실까요?


해당 코딩은 아래에 있습니다.

HashSet<Integer> totNum = new HashSet<Integer>();

do{

totNum.add(new Random().nextInt(45)+1);

if(totNum.size() == 45)break;

}while(true);

System.out.println(totNum);







0
  • 답변 4

  • kenu
    53k
    2015-04-04 19:55:54


            HashSet<Integer> totNum = new LinkedHashSet<Integer>();
    
            do{
    
                int e = new Random().nextInt(45) + 1;
                System.out.println(e);
                totNum.add(e);
    
                if(totNum.size() == 45)break;
    
            }while(true);
    
            System.out.println(totNum);
            final Iterator<Integer> iterator = totNum.iterator();
            while (iterator.hasNext()) {
                System.out.print(iterator.next() + ", ");
            }
    


  • pictripuk
    93
    2015-04-04 21:57:28

    답변은 감사합니다..

    하지만 제가 원한거와 좀 다르네요...

    제가 진정 궁금했던건 hashset 의 경우 기본적으로 위 에 말슴 드린대로 중복없음, 비 정렬 형태인데...

    즉 이해한대로라면 1에서 3까지 set에 있다면

    첫번째로 전부 출력하면 3,1,2

    가 나왔다면 다시 출력 할 시에 3,2,1 형태로 임의대로 나온다 입니다..

    그런대 결과가 계속 1,2,3  형태로 나오기에 여러분에게 질문 드린 부분 입니다.ㅠ

  • kenu
    53k
    2015-04-04 22:20:07


            HashSet<Integer> totNum = new LinkedHashSet<Integer>();


  • benelog
    68
    2015-04-05 09:19:04

    HashSet에서 꺼내올때 임의로 순서로 나온다는  뜻이 매번 순서가 바뀐다는 의미는 아닙니다. 입력된 순서와는 다를 수 있고, 그 순서가 보장되려면  LinkedHashSet를 써야합니다.


    그냥 HashSet에서의 출력순서는 hash bucket과 bucket내부에서의 저장구조와 관련이 있을것 같습니다. HashSet도 내부적으로는 hashMap.keySet을 썼던 걸로 기억하는데, HashMap의 내부구조는 아래 글을 참조하시면 도움이 되실듯합니다.  http://helloworld.naver.com/helloworld/textyle/831311

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