728x90
Iterator, ListIterator, Enumeration
- 컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스(읽어오기)
- Enumeration은 Iterator의 구버전(≒ Iterator)
- ListIterator는 Iterator의 접근성을 향상시킨 것(단방향에서 양방향으로)
메서드 | 설명 |
boolean hasNext() | 읽어올 요소가 남아있는지 확인. 있으면 true, 없으면 false 반환(확인) |
Object next() | 다음 요소를 읽어옴. next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전(읽기) |
Iterator 인터페이스의 메서드
메서드 | 설명 |
boolean hasMoreElements() | 읽어 올 요소가 남아있는지 확인. 있으면 true, 없으면 false 반환. Iterator의 hasNext()와 같음 |
Object nextElement() | 다음 요소를 읽어옴. nextElement()를 호출하기 전 hasMoreElements()를 호출해서 읽어올 요소가 남아있는지 확인하는 것이 안정 Iterator의 next()와 같음 |
Enumeration 인터페이스 메서드
- 컬렉션(List, Set, Map)에 저장된 요소들을 읽어오는 방법을 표준화한 것. Iterator로 hasNext()로 확인 후 Object next()로 읽기
- 컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용
List list = new ArrayList(); //다른 컬렉션으로 변경할 때 이 부분만 고치면 됨
Iterator it = list.iterator();
while (it.hasNext()) { //읽어 올 요소가 있는지 확인
System.out.println(it.next()); //다음 요소를 읽어옴
}
package chapter11;
import java.util.ArrayList;
import java.util.Iterator;
public class Study06Ex1 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
//iterator는 1회용임
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
// ==
// while(iterator.hasNext()) {
// Object obj = iterator.next();
// System.out.println(obj);
// }
//재사용하고자 할 때 다시 얻어와야함
iterator = list.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("for문으로");
for(int i = 0 ; i < list.size();i++) {
Object obj = list.get(i);
System.out.println(obj);
}
}
}
package chapter11;
import java.util.HashSet;
import java.util.Iterator;
public class Study06Ex1_1 {
public static void main(String[] args) {
HashSet list = new HashSet(); //Set은 Collection의 자손
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
// ==
// while(iterator.hasNext()) {
// Object obj = iterator.next();
// System.out.println(obj);
// }
// HashSet으로 변경 시 get() 메소드가 없어서 사용할 수 없음
// System.out.println("for문으로");
//
// for(int i = 0 ; i < list.size();i++) {
// Object obj = list.get(i);
// System.out.println(obj);
// }
}
}
package chapter11;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class Study06Ex1_2 {
public static void main(String[] args) {
Collection collection = new HashSet();
// Collection collection = new TreeSet();
collection.add("1");
collection.add("2");
collection.add("3");
collection.add("4");
collection.add("5");
Iterator iterator = collection.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
// ==
// while(iterator.hasNext()) {
// Object obj = iterator.next();
// System.out.println(obj);
// }
// HashSet으로 변경 시 get() 메소드가 없어서 사용할 수 없음
// System.out.println("for문으로");
//
// for(int i = 0 ; i < list.size();i++) {
// Object obj = list.get(i);
// System.out.println(obj);
// }
}
}
Map
Map에는 iterator()가 없음. keySet(), entrySet(), values()를 호출해야함
Map map = new HashMap();
(...생략...)
Iterator iterator = map.entrySet().iterator();
//Set eSet = map.entrySet(); Iterator it = eSet.iterator();
Arrays
배열을 다루기 편리한 메서드(static) 제공
- 배열의 출력 toString()
- 배열의 복사 copyOf(), copyOfRange() 새로운 배열 생성해서 반환
int[] arr = {0,1,2,3,4};
int[] arr2 = Arrays.copyOf(arr, arr.length); //arr2 = [0,1,2,3,4]
int[] arr3 = Arrays.copyOf(arr, 4); //arr3 = [0,1,2,3]
int[] arr4 = Arrays.copyOf(arr, 7); //arr4 = [0,1,2,3,4,0,0]
int[] arr5 = Arrays.copyOfRange(arr4, 1, 4); //arr5 = [1,2,3]
int[] arr6 = Arrays.copyOfRange(arr, 0, 7); //arr6 = [0,1,2,3,4,0,0]
- 배열 채우기 fill(), setAll()
int[] arr = new int[5];
Arrays.fill(arr, 9); //arr=[9,9,9,9,9]
Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1); //람다식, arr=[1,4,5,3,1](임의의 1~5사이의 정수값)
- 배열의 정렬과 검색 sort(), binarySearch()
int[] arr = {3,2,1,0,4};
// int idx = Arrays.binarySearch(arr, 2); //idx = -5 잘못된 결과, 이진 탐색은 정렬된 배열에만 가능
Arrays.sort(arr); //arr를 정렬
System.out.println(Arrays.toString(arr)); //[0,1,2,3,4]
int idx = Arrays.binarySearch(arr, 2); //idx = 2 올바른 결과
※순차 검색, 이진 검색
순차 검색 => 순서대로 처음부터 하나하나 찾고자하는 값을 탐색함.
이진 검색 => 정렬한 후 비교값을 반으로 나눔 => 반으로 나눔
이진(이분) 검색이 순차 검색보다 검색하는 것이 더 빠름
- 다차원 배열의 출력 deepToString()
int[] arr = {0,1,2,3,4};
int[][] arr2D = {{11,12},{21,22}};
System.out.println(Arrays.toString(arr)); //[0,1,2,3,4]
System.out.println(Arrays.deepToString(arr2D)); //[[11,12],[21,22]]
- 다차원 배열의 비교 deepEquals()
String[][] str2D = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
String[][] str2D2 = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
System.out.println(Arrays.equals(str2D, str2D2)); //false
System.out.println(Arrays.deepEquals(str2D, str2D2)); //true
- 배열을 List로 변환 asList(Object... a)
//asList(Object... a)가변 매개변수(개수가 정해지지 않음)
List list = Arrays.asList(new Integer[] {1,2,3,4,5}); //list=[1,2,3,4,5]
List list = Arrays.asList(1,2,3,4,5);
list.add(6); //List는 읽기 전용 UnsupportedOperationException 예외 발생
List list = new ArrayList(Arrays.asList(1,2,3,4,5)); //새로운 ArrayList. 변경가능
- 람다와 스트림 parallelXXX(), spliterator(), stream()
package chapter11;
import java.util.Arrays;
public class Study07Ex1 {
public static void main(String[] args) {
int[] arr = {0,1,2,3,4};
int[][] arr2D = {{11,12,13},{21,22,23}};
System.out.println("arr = " + Arrays.toString(arr)); //arr = [0,1,2,3,4]
System.out.println("arr2D = " + Arrays.deepToString(arr2D)); //arr2D = [[11,12,13],[21,22,23]]
int[] arr2 = Arrays.copyOf(arr, arr.length);
int[] arr3 = Arrays.copyOf(arr, 4);
int[] arr4 = Arrays.copyOf(arr, 7);
int[] arr5 = Arrays.copyOfRange(arr4, 1, 4);
int[] arr6 = Arrays.copyOfRange(arr, 0, 7);
System.out.println("arr2 = " + Arrays.toString(arr2)); //arr2 = [0,1,2,3,4]
System.out.println("arr3 = " + Arrays.toString(arr3)); //arr3 = [0,1,2,3]
System.out.println("arr4 = " + Arrays.toString(arr4)); //arr4 = [0,1,2,3,4,0,0]
System.out.println("arr5 = " + Arrays.toString(arr5)); //arr5 = [1,2,3]
System.out.println("arr6 = " + Arrays.toString(arr6)); //arr6 = [0,1,2,3,4,0,0]
int[] arr7 = new int[5];
Arrays.fill(arr7, 9);
System.out.println("fill(arr7) = " + Arrays.toString(arr7)); //arr=[9,9,9,9,9]
Arrays.setAll(arr7, (i) -> (int)(Math.random()*5)+1);
System.out.println("setAll(arr7)" + Arrays.toString(arr7)); //arr=[임의의 1~5사이의 정수값 5개]
for(int i : arr7) {
char[] graph = new char[i];
Arrays.fill(graph, '*');
System.out.println(new String(graph)+i);
}
String[][] str2D = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
String[][] str2D2 = new String[][] {{"aaa","bbb"},{"AAA","BBB"}};
System.out.println(Arrays.equals(str2D, str2D2)); //false
System.out.println(Arrays.deepEquals(str2D, str2D2)); //true
char[] chArr = {'A','D','C','B','E'};
System.out.println("chArr = " + Arrays.toString(chArr)); //chArr=[A,D,C,B,E]
System.out.println("index of B = " + Arrays.binarySearch(chArr, 'B')); //-2
Arrays.sort(chArr);
System.out.println("chArr = " + Arrays.toString(chArr)); //chArr=[A,B,C,D,E]
System.out.println("index of B = " + Arrays.binarySearch(chArr, 'B')); //1
}
}
240510
Comparator, Comparable
- 객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스
Comparable : 기본 정렬기준을 구현하는데 사용(default)
Comparator : 기본 정렬기준 외 다른 기준으로 정렬하고자 할 때 사용
정렬 => 두 대상을 비교하고 자리 바꿈(오름차순, 내림차순)
//Comparator
public interface Comparator{
int compare(Object o1, Object o2); //o1, o2 두 객체를 비교. 0이면 같음, 양수 o1>o2, 음수 o1<o2
boolean equals(Object obj); //equals를 오버라이딩해야함
}
//Comparable
public interface Comparable{
int compareTo(Object o); //주어진 객체(o)를 자신(this)과 비교
}
- compare()와 compareTo()는 두 객체의 비교결과를 반환하도록 작성
같으면 0, 오른쪽이 크면 음수, 작으면 양수
public final class Integer extends Number implements Comparable{
(...생략...)
public int compareTo(Integer anotherInteger){
int v1 = this.value;
int v2 = anotherInteger.value;
return (v1 < v2 ? -1 : (v1==v2? 0 : 1)); //같으면 0, 오른쪽 값이 크면 -1, 작으면 1을 반환
}
(...생략...)
}
package chapter11;
import java.util.Arrays;
import java.util.Comparator;
class Descending implements Comparator{
public int compare(Object o1, Object o2) {
if(o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable)o1;
Comparable c2 = (Comparable)o2;
return c1.compareTo(c2) * -1; //-1을 곱해서 기본 정렬방식의 역으로 변경 또는 c2.compareTo(c1)으로 작성
}
return -1;
}
}
public class Study08Ex1 {
public static void main(String[] args) {
String[] strArr = {"cat", "Dog", "brid", "tiger", "panda"};
Arrays.sort(strArr); //String의 Comparable구현에 의한 정렬
//정렬을 위해서는 1) 대상 2) 기준이 필요함
//static void sort(Object[] a) //객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
//static void sort(Object[] a, Comparator c) //지정한 Comparator에 의한 정렬
System.out.println("strArr = " + Arrays.toString(strArr)); //strArr = [Dog, brid, cat, panda, tiger] 대문자가 먼저
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); //대소문자 구분 안함
System.out.println("strArr = " + Arrays.toString(strArr)); //strArr = [brid, cat, Dog, panda, tiger]
Arrays.sort(strArr,new Descending()); //역순 정렬
System.out.println("strArr = " + Arrays.toString(strArr)); //strArr = [tiger, panda, cat, brid, Dog]
}
}
Integer와 Comparable
public final class Integer extends Number implements Comparable{
(...생략...)
public int compareTo(Integer anotherInteger){
int v1 = this.value;
int v2 = anotherInteger.value;
return (v1 < v2 ? -1 : (v1==v2? 0 : 1)); //같으면 0, 오른쪽 값이 크면 -1, 작으면 1을 반환
}
(...생략...)
}
// public final class Integer extends Number implements Comparable{
// (...생략...)
// public int compareTo(Integer anotherInteger){
// int v1 = this.value;
// int v2 = anotherInteger.value;
// return thisVal - anotherVal; //내림차순의 경우 반대로 뺄셈
// }
// (...생략...)
// }
//버블정렬
static void sort(int[] inArr){
for(int i=0;i<inArr.length-1;i++){
for(int j=0;j<intArr.length-1-i;j++){
int tmp = 0;
if(intArr[j]>intArr[j+1]){
tmp = intArr[j];
intArr[j] = intArr[j+1];
intArr[j+1] = tmp;
}
}
}
}
728x90