728x90

Set

순서x 중복저장x
key로 저장
key에 null 저장불가능

HashSet

대표적인 set

 



LinkedHashSet

순서 o 중복저장x
순서 유지되고 중복저장 안되는 컬렉션
중복 저장이 안된 이유?
Dog클래스에 equals()를 오버라이딩 해줬기 때문에 내용비교가 가능하게 되었고
이 때문에 같은 객체로 인지되었기 때문

TreeSet

정렬을 해주는 Set
오름차순 정렬
   정렬 기준을 세워주는 건 <String>
   String 클래스 안에 comparable 인터페이스가(compareTo())가
   구현 되어있기 때문에 정렬 기준이 정해져 있고, 정렬 기준이 정해져 있는
   클래스 String이 TreeSet 안에 들어가 있기 때문에 정렬 가능

 

HashSet<String>은 객체도 받음

<-> ArrayList<String>은 에러났었음

HashSet hashSet = new HashSet<String>();

HashSet<String> hSet = new HashSet<>();
        hSet.add("가가");
        // addAll
        hashSet.addAll(hSet);
        System.out.println(hashSet); // [가, 가가, 나]  <- 순서xxx 기억할 것
        // HashSet<String>은 객체도 받음
        //      <-> ArrayList<String>은 에러났었음
        hashSet.add(new Dog("다",10)); // [가, 다 10.0kg, 가가, 나]



순서x 중복x HashSet, add하면 어디에 추가될까?

맨 앞에 추가됨

        // 순서x 중복x HashSet, add하면 어디에 추가될까?
        // 맨 앞에 추가됨
        set1.add(new Dog("d",10)); // [d 10.0kg, c 10.0kg, b 10.0kg, a 10.0kg, a 10.0kg]
        System.out.println(set1);
        set1.add(new Dog("e",10));
        System.out.println(set1); // [e 10.0kg, d 10.0kg, c 10.0kg, b 10.0kg, a 10.0kg, a 10.0kg]


순서o LinkedHashSet, add하면 어디에 추가될까?

마지막에 추가됨

linkedHashSet.add(new Dog("ㄱ",10));
System.out.println(linkedHashSet);  // [ㄱ 10.0kg]
linkedHashSet.add(new Dog("ㄴ",10));
System.out.println(linkedHashSet); // [ㄱ 10.0kg, ㄴ 10.0kg]
linkedHashSet.add(new Dog("ㄷ",10));
System.out.println(linkedHashSet);  // [ㄱ 10.0kg, ㄴ 10.0kg, ㄷ 10.0kg]

 

 

 

전체 코드

Set
순서x 중복저장x
key로 저장
key에 null 저장불가능

HashSet

LinkedHashSet
순서 o 중복저장x
순서 유지되고 중복저장 안되는 컬렉션
중복 저장이 안된 이유?
Dog클래스에 equals()를 오버라이딩 해줬기 때문에 내용비교가 가능하게 되었고
이 때문에 같은 객체로 인지되었기 때문


TreeSet
정렬을 해주는 Set
오름차순 정렬
   정렬 기준을 세워주는 건 <String>
   String 클래스 안에 comparable 인터페이스가(compareTo())가
   구현 되어있기 때문에 정렬 기준이 정해져 있고, 정렬 기준이 정해져 있는
   클래스 String이 TreeSet 안에 들어가 있기 때문에 정렬 가능


순서x 중복x HashSet, add하면 어디에 추가될까?
맨 앞에 추가됨
순서o LinkedHashSet, add하면 어디에 추가될까?
마지막에 추가됨

 

 

 

 

 public void method01() {
        HashSet set0 = new HashSet();
        HashSet<Dog> set1 = new HashSet<>(); // 뒤 제네릭 생략 → 타입추론 : 뒤 생략가능하다는 의미


        // add(E e):boolean
        set1.add(new Dog("a",10));
        set1.add(new Dog("b",10));

        System.out.println(set1);   // [b 10.0kg, a 10.0kg]

        // set 중복 저장안되는데 중복 저장 되는 이유 : equals() 오버라이딩 안되어있어서
        set1.add(new Dog("a",10));
        System.out.println(set1);   // [b 10.0kg, a 10.0kg, a 10.0kg]

        // add(Object e):boolean
        Dog puppy = new Dog("c",10);
        set1.add(puppy);
        System.out.println(set1);   // [c 10.0kg, b 10.0kg, a 10.0kg, a 10.0kg]
        // 순서x 중복x HashSet, add하면 어디에 추가될까?
        // 맨 앞에 추가됨
        set1.add(new Dog("d",10)); // [d 10.0kg, c 10.0kg, b 10.0kg, a 10.0kg, a 10.0kg]
        System.out.println(set1);
        set1.add(new Dog("e",10));
        System.out.println(set1); // [e 10.0kg, d 10.0kg, c 10.0kg, b 10.0kg, a 10.0kg, a 10.0kg]


        // LinkedHashSet
        // 순서 o 중복저장x
        // 순서 유지되고 중복저장 안되는 컬렉션
        // 중복 저장이 안된 이유?
        // Dog클래스에 equals()를 오버라이딩 해줬기 때문에 내용비교가 가능하게 되었고
        // 이 때문에 같은 객체로 인지되었기 때문
        LinkedHashSet<Dog> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.add(new Dog("ㄱ",10));
        System.out.println(linkedHashSet);  // [ㄱ 10.0kg]



        // 순서o LinkedHashSet, add하면 어디에 추가될까?
        // 마지막에 추가됨
        linkedHashSet.add(new Dog("ㄴ",10));
        System.out.println(linkedHashSet); // [ㄱ 10.0kg, ㄴ 10.0kg]
        linkedHashSet.add(new Dog("ㄷ",10));
        System.out.println(linkedHashSet);  // [ㄱ 10.0kg, ㄴ 10.0kg, ㄷ 10.0kg]
        linkedHashSet.add(new Dog("ㄷ",10));
        // equals() 주석 처리후에는 중복가능해짐
        System.out.println(linkedHashSet);  // [ㄱ 10.0kg, ㄴ 10.0kg, ㄷ 10.0kg, ㄷ 10.0kg]
        // equals() 주석 풀고 난 후에는 중복x
        System.out.println(linkedHashSet);  // [ㄱ 10.0kg, ㄴ 10.0kg, ㄷ 10.0kg]


        // HashSet<String>
        // equals() 오버라이딩 필요x
        HashSet hashSet = new HashSet<String>();
        // equals() 메소드 주석처리함

        hashSet.add("가");
        hashSet.add("나");
        System.out.println(hashSet);    // [가, 나]
        HashSet<String> hSet = new HashSet<>();
        hSet.add("가가");
        // addAll
        hashSet.addAll(hSet);
        System.out.println(hashSet); // [가, 가가, 나]  <- 순서xxx 기억할 것
        // HashSet<String>은 객체도 받음
        //      <-> ArrayList<String>은 에러났었음
        hashSet.add(new Dog("다",10)); // [가, 다 10.0kg, 가가, 나]
        hashSet.add("나나");
        System.out.println(hashSet); // [가, 다 10.0kg, 가가, 나나, 나]
        // 순서 없어서 가운데에도 추가되고 앞에 추가되기도 하고...
        hashSet.remove(new Dog("다",10));
        System.out.println(hashSet); // [가, 가가, 나나, 나]

        // TreeSet
        // 정렬을 해주는 Set
        // 오름차순 정렬
        TreeSet<String> treeSet = new TreeSet<>();
        treeSet.add("아");
        treeSet.add("이");
        treeSet.add("우");

        System.out.println(treeSet); // [아, 우, 이]
        treeSet.addAll(hashSet);
        System.out.println(treeSet); // [가, 가가, 나, 나나, 아, 우, 이]



        // 전체데이터 넣는 방법
        // 1) addAll()
        // 2) 생성자 매개변수 이용

    }

 

728x90
반응형
728x90

 

1-1. // add(E e):boolean

 

1-2. add(int index, E element):void

 

2. size()

 

3.remove()
remove(int index):E
remove(Object o):boolean

 

4. set()
set(int index, E e):E
== replace 대체

 

5. get() 
get(int index):E

 

 6. contains(Object) : boolean
해당 객체를 포함한지 true/false반환

 

7. indexOf(Object o): int 
해당 객체의 인덱스번호 반환
해당 값이 없을경우 -1 반환

 

8. equals(Object o):boolean
지정된 객체와 목록이 같은지 비교

 

9. clear()
clear():void

 

10. isEmpty():boolean

 

 

 

 

 

package MVC.controller;
import java.util.ArrayList;
import MVC.model.vo.pModelVo05;
public class pController05 {
	
	// List
	// ArrayList
	public void pList() {
		
		ArrayList<pModelVo05> al = new ArrayList<>();
		
		// e :제네릭에 지정 받은 타입을 그대로 쓰겠다. 
		// o : 안에 뭘 받아올지 모르니까 다 받을 수 있게 오브젝트로 쓰겠다. 엘레멘트로 타입을 지정할 필요가 없다
		
		// 1-1. // add(E e):boolean
		al.add(new pModelVo05("과일",5000));
		al.add(new pModelVo05("스낵 ",1500));
		System.out.println(al.add(new pModelVo05("껌",1500))); // true
		System.out.println(al); // [과일[5000원], 과자[1500원]]
		
		// 1-2. add(int index, E element):void
		al.add(3, new pModelVo05("쌀",50000)); // 마지막3번이 아닌 더 뒤4로 하니 길이 에러
		System.out.println(al); // [과일[5000원], 스낵 [1500원], 껌[1500원], 쌀[50000원]] 
//		System.out.println(al.add(3, new pModelVo05("믈",500))); // void 즉 없는 값을 출력하라해서 에러
		
		// 2. size()
		System.out.println(al.size()); // 4
		
		al.add(new pModelVo05("계란",6000)); // 자동 길이추가
		System.out.println(al); // [과일[5000원], 스낵 [1500원], 껌[1500원], 쌀[50000원], 계란[6000원]]
		
		
		// 3.remove()
		// remove(int index):E
		// remove(Object o):boolean
		System.out.println("=====remove=====");
		al.remove(0); // 과일 삭제
		System.out.println(al.remove(0)); // 스낵 [1500원] // 스낵삭제
		System.out.println(al); // 껌[1500원], 쌀[50000원], 계란[6000원]]
		
		al.remove(new pModelVo05("껌",1500)); // 작동x. 모델에서 오버라이딩 안했기 때문
		System.out.println(al); // [껌[1500원], 쌀[50000원], 계란[6000원]]
		// 모델 오버라이딩 후 			// [쌀[50000원], 계란[6000원]]
		
		System.out.println(al.remove(new pModelVo05("쌀",50000))); // true // 쌀 삭제
		
		pModelVo05 pm = new pModelVo05("계란",6000);
		System.out.println(al.remove(pm)); // true
		System.out.println(al); // []
		al.add(new pModelVo05("물",500));
		al.add(new pModelVo05("요거트",1000));
		System.out.println(al); // [물[500원], 요거트[1000원]]
		
		// 4. set()
		// set(int index, E e):E
		// == replace 대체
		System.out.println(al.set(1, new pModelVo05("커피",1500))); // 요거트[1000원]  // 바꿔진 엘리먼트값 출력
		al.set(1, new pModelVo05("커피",1500)); 				
		System.out.println(al); // [물[500원], 커피[1500원]]
		
		
		// 5. get() 
		// get(int index):E
		System.out.println(al.get(1)); // 커피[1500원]
		System.out.println(al.get(0)); // 물[500원]
		
		// 6. contains(Object) : boolean
		// 해당 객체를 포함한지 true/false반환
		System.out.println(al.contains(new pModelVo05("물",500))); // true
		System.out.println(al.contains(new pModelVo05("물",0))); // false
		
		
		// 7. indexOf(Object o): int 
		// 해당 객체의 인덱스번호 반환
		// 해당 값이 없을경우 -1 반환
		System.out.println(al.indexOf(new pModelVo05("물",500))); // 0
		System.out.println(al.indexOf(new pModelVo05("커피",1500))); // 1
		System.out.println(al.indexOf(new pModelVo05("커피",500))); // -1 // 없을경우-1반환
		
		
		// 8. equals(Object o):boolean
		// 지정된 객체와 목록이 같은지 비교
		System.out.println(al);  // [물[500원], 커피[1500원]]
		System.out.println(al.equals(new pModelVo05("물",500))); // false //[물[500원], 커피[1500원]]와 비교해서 false
		System.out.println(al.equals(new pModelVo05("커피",1500))); //al인 [물[500원], 커피[1500원]]와 비교 하니 false
		
		System.out.println(new pModelVo05("물",500).equals(new pModelVo05("물",500))); // true
		System.out.println(new pModelVo05("커피",1500).equals(new pModelVo05("커피",1500))); // true


		// 9. clear()
		// clear():void
		al.clear();
		System.out.println(al); // []
		
		// 10. isEmpty():boolean
		System.out.println(al.isEmpty()); // true
		
		System.out.println("=====ArrayList<string>=====");
		
		ArrayList<String> aList = new ArrayList<>();
		aList.add(new String("인내"));
		aList.add(new String("노력"));
		System.out.println(aList.remove(new String("인내")));
		System.out.println(aList);
//		aList.equals(new String("인내"));
		System.out.println(aList.equals(new String("인내")));
		
		
	}	
		
}

 

package MVC.model.vo;


public class pModelVo05 {


	private String flavor;
	private int price;
	
	public pModelVo05() {}
	public pModelVo05(String flavor, int price) {
		super(); // 안써도 됨. 자동완성해서 생긴것. 원래는 생성자를 불러올 때 부모생성자를 불러오고 시작함. 
		this.flavor = flavor;   // 그래야 자식 객체를 만들 때 부모 객체 생성자를 만들기 때문
		this.price = price;
	}
	
	// getter / setter
	public String getFlavor() {
		return flavor;
	}
	public int getPrice() {
		return price;
	}
	public void setFlavor(String flavor) {
		this.flavor = flavor;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
	// toString
	@Override
	public String toString() {
		return flavor+"["+price+"원]";
	}
		
	
	@Override
	public boolean equals(Object obj) {
		// 객체 비교
		if (this == obj) { // this는 주소값 비교할려고 넣은 것
			return true;
		}
		if(obj == null) {
			return false;
		}
		if(getClass() != obj.getClass()) { // 내 클래스 정보와 상대방의 클래스 정보가 같은지 비교
			return false;
		}
		
		pModelVo05 other = (pModelVo05)obj; // 다운캐스팅 : obj->Snack
		if(flavor == null) {      // other는 레퍼런스 변수
			if(other.flavor != null) { 
				return false;
			}
		}else if(!flavor.equals(other.flavor)) { // 이름에 대한 비교
			return false;
		}
		
		if(price != other.price) { // 목록에 대한 비교
			return false;
		}
		return true;
	}
	
	@Override
	public int hashCode() {
		final int PRIME = 31; // 컴퓨터가 이해하기 좋은 숫자가 31이라함
		int result = 1;
		
		result = PRIME * result + (flavor == null ? 0 : flavor.hashCode()); // 내 해쉬코드가 아니라 스트링의 해쉬코드를 가져오는 것
		result = PRIME * result + price; // 형이 안맞아서 에러나니 캐스팅 또는 소수점 없게끔 계산
		
		return result;
	}	
	
	
}

 

728x90
반응형
728x90

 

Collection

Set

 

인터페이스 Set의 주요 클래스

 

HashSet

LinkedHashSet

TreeSet

 

add(E e)

add(Object e):boolean

 

package controller;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.TreeSet;
import model.vo.pModelVo02;

public class pController02 {
	public void firstR() {
		
		HashSet<pModelVo02> hs = new HashSet<>();
		System.out.println("====HashSet====");
		
		hs.add(new pModelVo02("name",1));
		hs.add(new pModelVo02("dont",2));// 순서x
		hs.add(new pModelVo02("dont",2));// 중복x 
		System.out.println(hs);			 // 주소값달라서 중복됨
		
		// 중복 가능케 할려면? 
		// model 데이터에서 오버라이딩or 이미되었는 String,Integer클래스 사용
		HashSet<String> strs = new HashSet<>();
		strs.add(new String("a")); // 모델에서 세팅값의 Set이 아니라서 
		strs.add(new String("b")); // 값이 문자열 하나
		strs.add(new String("b")); // 중복x
		System.out.println(strs);
		
		System.out.println("====LinkedHashSet====");
		// LinkedHashSet
		// 순서유지되는 set
		// add(Object e):boolean
		// 리턴 : 트루반환
		LinkedHashSet<pModelVo02> lhs = new LinkedHashSet<>();
		lhs.add(new pModelVo02("1",1)); // 순서O
		lhs.add(new pModelVo02("2",2)); // 중복x 이나 주소값 달라 중복됨
		lhs.add(new pModelVo02("2",2)); // [(1-1), (2-2)] model에서 오버라이딩 후 중복x
		System.out.println(lhs); // [(1-1), (2-2)]
		System.out.println(lhs.add(new pModelVo02("3",3))); // true
		System.out.println(lhs); // [(1-1), (2-2), (3-3)]
		
		System.out.println("====TreeSet====");
		// TreeSet
		// 정렬가능 set
		TreeSet<pModelVo02> ts = new TreeSet<>(lhs);// 정렬할 set값 넣기
		System.out.println(ts); // error : comparable x 
		// 에러원인 : 정렬기준점인 comparable없음
		// 에러메세지 : The type pModelVo02 must implement the inherited abstract method Comparable.compareTo(Object)
		// compareTo(Object o) 후 정상작동
		ts.iterator(); // 반복자iterator를 오름차순으로 반환
		System.out.println(ts);
		
		
		Iterator<pModelVo02> it = lhs.iterator(); // iterator 인덱스 없다
		while(it.hasNext()) { 
			pModelVo02 p = it.next(); 
			System.out.println(p);
		}	
		
		
		// String클래스에 comparable이 이미 오버라이딩 되어있어서 정상작동
		TreeSet<String> trs = new TreeSet<>();
		trs.add(new String("a")); // set 중복x
		trs.add(new String("a")); 
		trs.add(new String("d")); // 정렬
		trs.add(new String("c")); 
		trs.add(new String("b"));
		System.out.println(trs);  // [a, b, c, d]
		
		
//		TreeSet<pModelVo02> tss = new TreeSet<>(lhs); // error : java.lang.ClassCastException
//		System.out.println(tss);
		
	}

 

 

 

728x90
반응형

+ Recent posts