본문 바로가기

아옳옳의 코딩공부/아옳옳 자바코딩공부

2021-04-13 자바공부 (컬렉션 프레임워크 Iterator,collections 클래스 , Hashset<E> 클래스 )

반응형

Iterator를 이용한 인스턴스 순차적 접근 

Iteratora의 메소드 

boolean hasNext()  :  다음번 요소가 있으면 true 반환 

E next() : 다음번 요소를 반환 

void remove() : 현재 위치의 요소 삭제 

 

동작의 원리 

간단한 코드예시 

public class Iterator_Ex {

	ArrayList<String> list = new ArrayList<String>(); // 리스트 생성 

	public static void main(String[] args) {

		Iterator_Ex iter = new Iterator_Ex();
		iter.init(); // 메소드 실행 
		iter.execute();
	}

	public void init() {
		list.add("아옳옳");
		list.add("아옳옳옳");
		list.add("아옳옳옳옳");

	}

	public void execute() {
		for (int i = 0; i < list.size(); i++) { // 포문이용 출력
			System.out.println(list.get(i));
		}
		System.out.println("-------------------------------");
		for (String lis : list) { // 포이치문 출력
			System.out.println(lis);
		}
		System.out.println("-------------------------------");

		Iterator<String> iter = list.iterator(); // 이터럴 실행 
		while (iter.hasNext()) {
			System.out.println(iter.next());
		}

	}
}

결과값

 

이렇게 ArrayList 객체인 list의 내부 객체를 반복 처리하는 세 가지 방법 

 

마지막 배열처럼 선언과 동시에 넣어 줄수도 있다 .

List<String> list = array.asList("Toy", "Dog" ) 

new ArrayList<>(list) 


Collections 클래스 

중요한 포인트는 모든 메소드가 static 이므로 클래스 이름으로 바로 호출 가능하다 


Hashset

특징!

데이터 저장순서를 유지 않함 

데이터의 중복 허용 안함 

 

옆 그림처럼 다른 리스트들은 나란히 있다고 생각한다면 이것은 포대에 담아서 뒤죽박죽 된다라고 생각하면됨 

 

자 동일한 데이터의 중복 저장을 허용 하지 않는다고 헀는데 그렇다면 어떤 기준으로 동일한지 안한지를 알 수 있을까? 

오브젝트 클래스에 있는 해쉬코드 메소드와 이퀄스 메소드를 통해서 해줄 수 있다. 

1.단계는 분류의 목적 이고 2. 는 같은 것을 찾기위함이다 .

여기서 알아야할 것은 바로 해시 알고리즘 

위처럼 알고리즘을 통하여 만들어 줄 수도 있지만 간단한 코드를 통하여 할 수도 있다. 

코드주석을 보자 

public class Student {
	int sno;
	String name;
	public Student(int sno, String name) {		
		this.sno = sno;
		this.name = name;
	}	
	// 가운데 getter setter 생략
	@Override
	public int hashCode() { // 1. 자동호출  
		//return (sno + name.hashCode())/2;  해쉬 알고리즘 사용 
		return Objects.hash(sno,name); //해쉬 알고리즘 간편화  
        //해쉬 알고리즘 간편화는 사실 내가 직접만드는것 보다는 좋은 알고리즘은 아니다. (중간정도)
	}
	@Override
	public boolean equals(Object obj) { // 2. 자동호출  		
		if(obj instanceof Student) {
			Student student = (Student)obj;
			return (sno == student.sno)&&(name.equals(student.name));
			}else return false;		
	}	
}

//////////메인

public class Hahset_Ex {

	public static void main(String[] args) {
    
HashMap<Student, Integer> map = new HashMap<Student, Integer>();
		map.put(new Student(1,"아옳옳"), 95);
		map.put(new Student(1,"아옳옳"), 95);
		System.out.println("총 entry 수: " +map.size());
        }
    }

결과값 총 entry 수: 1 


hashmap<K,V> 

이건 생각보다 쉽다 예전에 봐오던 번들처럼 키와 값으로 구성되어 있다. 

 

요소삽입 put() , 요소 검색 get()

 

해쉬맵은 iterator를 사용못하기 때문에 Set <K> keyset()  을 이용하여 iterator 을 사용한다 . 

 

해쉬맵을 사용한 self chek 코드 

 

///////////////////////////// 멀록 클래스 //////////////////////////////
public class Mullock {
	String name; // 이름 
	String jop; // 직업
	String skill; // 멀록의 기술
	int rank;
	public Mullock(String name, String jop, String skill, int rank) {
		this.name = name;
		this.jop = jop;
		this.skill = skill;
		this.rank = rank;
	}
	@Override
	public int hashCode() {
		return Objects.hash(rank);
	}
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Mullock) {
			Mullock mullock = (Mullock)obj;
			return rank==mullock.rank;
		}else {
			return false;
		}
		
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getJop() {
		return jop;
	}
	public void setJop(String jop) {
		this.jop = jop;
	}
	public String getSkill() {
		return skill;
	}
	public void setSkill(String skill) {
		this.skill = skill;
	}
	public int getRank() {
		return rank;
	}
	public void setRank(int rank) {
		this.rank = rank;
	}
    
    //////////////// 멀록 태스트 클래스(메인) /////////////////
    public class Mullock_Ex {

	public static void main(String[] args) {

		HashMap<Integer, Mullock> hash = new HashMap<Integer, Mullock>();
		hash.put(1, new Mullock("아옳이", "총잽이", "두두다다", 1));
		hash.put(2, new Mullock("아옳", "멀록왕", "아옳옳옳옳", 2));
		hash.put(3, new Mullock("아아옳", "칼잽이", "쓱쓱싹싹", 3));
		hash.put(4, new Mullock("아오기", "활잽이", "쑉쑉쇼쇽", 4));
		hash.put(1, new Mullock("아옳이", "총잽이", "두두다다", 1));

		Scanner scan = new Scanner(System.in);
		while (true) {

			for (int i = 1; i < hash.size() + 1; i++) {
				Mullock m1 = hash.get(i);
				System.out.println(m1);
				
			}
			System.out.println("===============================");
			System.out.println("원하는 아옳이의 랭크를 입력하시오 (종료는-1입력하시오)");
			int a = scan.nextInt();
			Mullock m = hash.get(a);
			if (a == -1)break;
			if (m != null) {
				System.out.println(m);

			} else {
				System.out.println("해당번호는 없습니다.");
			}

		}

	}
}

이렇게 중복된 아옳이도 빠져있고 , 원하는 숫자를 입력했을때 키 값으로 원하는 아옳이를 찾아오는걸 볼수있다~! 

 

 

반응형