티스토리 뷰
20일차인 오늘은 ArrayList, HashSet, Queue, Stack에 대해서 학습했다.
import java.util.ArrayList;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
//ArrayList numbers를 만들고 10 부터 40까지 add한다.
//2번째값에 50을 집어넣고 출력한다.
//인덱스값을 하나 출력한다.
ArrayList<String> numbers = new ArrayList<String>();
numbers.add("10");
numbers.add("20");
numbers.add("30");
numbers.add("40");
System.out.println(numbers);
// 1번째 인덱스에 50 값 넣기
numbers.add(1, "50");
System.out.println(numbers);
// 2번째 인덱스값 출력
System.out.println(numbers.get(2));
// 45인 값의 인덱스 출력 없으면 -1 출력
System.out.println(numbers.indexOf("45"));
// iterator 생성
Iterator<String> it = numbers.iterator();
while(it.hasNext()) {
String value = (String)it.next();
// 30값 지워버리기
if(value.equals("30")) {
it.remove();
}
System.out.println(value);
}
System.out.println();
System.out.println();
System.out.println();
// 향상된 for문
for(String value : numbers) {
System.out.println(value);
}
System.out.println();
System.out.println();
System.out.println();
// 일반 for문
for(int i = 0; i < numbers.size(); i++) {
System.out.println(numbers.get(i));
}
}
}
ArrayList numbers 객체를 생성하고
값을 넣고 싶을 땐, add();
a 번째 인덱스에 값을 넣고 싶으면 add(a, value);
a 번째 인덱스의 값을 출력하고 싶으면 get(a);
a 값의 인덱스값을 출력하고 싶으면 indexOf(a);
Iterator는 자바의 컬렉션 프레임웍에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 하였는데 그 중 하나가 Iterator이다.
출처: https://vaert.tistory.com/108 [Vaert Street:티스토리]
iterator를 it를 생성해서
ArrayList 객체에 값을 저장하고 while문을 이용해서 ArrayList의 값을 모두 출력한다.
다음은 객체 정렬이다. 객체의 정렬 기준을 정의하는 첫번째 방법은 정렬 대상 클래스를 자바에서 기본적으로 제공하고 있는 Comparable 인터페이스를 구현하도록 변경하는 것이다. Comparable 인터페이스의 compareTo() 메서드를 통해 인자로 넘어온 같은 타입의 다른 객체와 대소 비교가 가능하다. 메소드를 호출하는 객체가 인자로 넘어온 객체보다 작을 경우에는 음수를 리턴하고, 크기가 동일하다면 0, 클 경우에는 양수를 리턴해준다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
ArrayList<Student_5> list = new ArrayList<>();
list.add(new Student_5("백일홍", 1, 1, 100, 90, 80));
list.add(new Student_5("해당화", 1, 2, 35, 77, 89));
list.add(new Student_5("나팔꽃", 1, 3, 67, 90, 54));
list.add(new Student_5("장미꽃", 1, 4, 80, 77, 23));
list.add(new Student_5("들국화", 1, 5, 67, 90, 80));
list.add(new Student_5("패랭이", 1, 6, 30, 77, 44));
list.add(new Student_5("해바라기", 2, 5, 56, 90, 56));
list.add(new Student_5("코스모스", 3, 3, 78, 33, 80));
list.add(new Student_5("백합꽃", 4, 7, 12, 88, 77));
list.add(new Student_5("하야신스", 7, 3, 98, 90, 80));
Collections.sort(list);
Iterator<Student_5> itt = list.iterator();
while(itt.hasNext()) {
Student_5 st = itt.next();
System.out.println(st);
}
}
}
class Student_5 implements Comparable<Student_5>{
String name = "";
int ban = 0;
int no = 0;
int kor = 0;
int eng = 0;
int math = 0;
int total = 0;
public Student_5(String name, int ban, int no, int kor, int eng, int math) {
this.name = name;
this.ban = ban;
this.no = no;
this.kor = kor;
this.eng = eng;
total = kor + eng + math;
}
public String toString() {
return name + '\t' + ban + '\t' + no + '\t' + kor + '\t' + eng + '\t' + math + '\t' + total;
}
@Override
public int compareTo(Student_5 stt) {
// TODO Auto-generated method stub
return this.total - stt.total;
}
}
Comparable 인터페이스를 사용해서 정렬을 하려면 중요한것은 compareTo 메서드를 오버라이딩해서 상황에 맞게 바꿔줘야한다는 것이다. 나는 지금 total 변수로 기준으로 정렬하고 싶어서 total에 맞게 정의했다.
Set 과 LinkedHashSet
import java.util.LinkedHashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
//set은 list와 다르게 객체(데이터)를 중복해서 저장할 수 없다.
//객체(데이터)를 인덱스로 관리하지 않기 때문에 저장 순서가 보장되지 않는다.
Object[] obj = {"1", new Integer(1), "1", "4", "3"};
//LinkedHashSet도 중복된 데이터를 저장할 수 없다. 차이점은 입력된 순서대로 데이터를 관리한다.
Set set = new LinkedHashSet();
for(int i = 0; i < obj.length; i++) {
set.add(obj[i]);
}
System.out.println(set);
}
}
Set - HashSet, TreeSet, LinkedHashSet
public class HashSetLotto_1 {
public static void main(String[] args) {
HashSet<Integer> set = new HashSet<Integer>();
while(set.size() < 6) {
set.add((int)(Math.random() * 45) + 1);
}
System.out.println("로또 번호");
System.out.println(set);
}
}
HashSet은 중복이 안되는 특성을 이용해서 만든 간단한 로또번호 추출기.
- 스택
- 순차적 데이터 추가/삭제
- ArrayList와 같은 배열기반의 컬렉션이 적합
- 큐
- 데이터를 꺼낼 때 항상 첫 번째 저장된 데이터를 삭제
- 즉 중간에 데이터 추가/삭제가 쉬운 LinkedList가 적합
실행
Stack<Integer> st = new Stack<>();
Queue<Integer> q = new LinkedList<>(); // Queue 인터페이스의 구현체인 LinkedList 사용
st.push(1);
st.push(2);
st.push(3);
q.offer(1);
q.offer(2);
q.offer(3);
System.out.println("=====Stack=====");
while (!st.empty())
System.out.println(st.pop());
System.out.println("=====Queue=====");
while (!q.isEmpty())
System.out.println(q.poll());
결과
=====Stack=====
3
2
1
=====Queue=====
1
2
3
- 큐는 먼저 넣은것이 먼저 꺼내지는 (FIFO)
- 스택은 먼저 넣은것이 나중에 꺼내지는 (LIFO)
- 자바에서 스택은 Stack 클래스 로 제공하고 있지만 큐는 Queue 인터페이스로 정의해놨다.
- Queue 인터페이스를 구현한 클래스 중 하나를 선택해서 사용
- 위의 예제에서는 LinkedList 사용
- 구현 클래스 참고
출처 : https://velog.io/@roro/Java-Stack-Queue
[Java] - Stack & Queue
자바에서 제공하는 Stack과 Queue에 대해 알아보자.스택과 큐 개념 자세한 설명은 자료구조 - 스택/큐 포스팅 참조스택과 큐를 구현하기 위해서 어떤 컬렉션 클래스를 사용하는게 좋을까? 스택순차
velog.io
스택 메서드
- push
Stack에 객체를 저장합니다.
- pop
Stack의 맨 위에 저장된 객체를 꺼냅니다.
- peek
Stack의 맨 위에 저장된 객체를 반환합니다. Stack에서 꺼내지는 않습니다. 비었을 때 null을 반환합니다.
- empty
Stack이 비어있는지 알려줍니다. 있으면 true, 없으면 false를 반환합니다.
- search
Stack에서 주어진 객체를 찾아서 그 위치를 반환합니다. (배열과는 달리 1부터 시작합니다.)
큐 메서드
- add
Queue에 객체를 저장합니다. 성공하면 true, 실패하면 false를 반환합니다.
- element
삭제없이 저장된 요소를 읽어옵니다. peek와 다른 점은 queue가 비었을 때 Exception을 발생시킵니다. (peek()는 null을 반환합니다.)
- offer
Queue에 객체를 저장합니다. 성공하면 true, 실패하면 false를 반환합니다.
- peek
삭제없이 읽어옵니다. Queue가 비었을 때 null을 반환합니다.
- poll
Queue에서 꺼내옵니다. 비어있으면 null을 반환합니다.
- remove
Queue에서 꺼내옵니다. 비어있으면 예외를 발생시킵니다.
Stack 2개를 이용해서 간단한 예제하나를 실행해 보겠다.
public static Stack back = new Stack();
public static Stack forward = new Stack();
private static void goFoward() {
if(!forward.empty()) {
back.push(forward.pop());
}
}
private static void goBack() {
if(!back.empty()) {
forward.push(back.pop());
}
}
private static void printprint() {
System.out.println("back : " + back);
System.out.println("forward : " + forward);
System.out.println("현재화면 : " + back.peek() + "입니다.");
System.out.println();
}
private static void goURL(String str) {
back.push(str);
if(!forward.empty()) {
forward.clear();
}
// 데이터를 추가하는 작업을 push 라고 한다
// 리스트에서의 add와 같은 역할이다.
// 데이터를 삭제하는 작업을 pop이라고 한다.
// 리스트에서의 remove와 같은 역할이다.
}
}
홈페이지의 앞으로, 뒤로 갈 수 있는 메서드를 생성한다.
goURL("1. Google");
goURL("2. Daum");
goURL("3. Nate");
goURL("4. Naver");
back 스택에 4개의 데이터가 쌓이고, printprint() 메서드에 의해서
결과
back : [1. Google, 2. Daum, 3. Nate, 4. Naver]
forward : []
현재화면 : 4. Naver입니다.
goBack() 메서드에 의해서 back에 있던 데이터에서 4. Naver가 forward로 이동하게 되고 printprint()메서드에 의해서 다음과 같이 출력되게 된다.
결과
back : [1. Google, 2. Daum, 3. Nate]
forward : [4. Naver]
현재화면 : 3. Nate입니다.
이런식으로 back과 forward의 스택에서의 데이터값의 이동에 의해서 간단한 예제를 살펴봤다!
그림이 너무 허접하지만.. 최선을 다했다는것.. 오늘도 고생했습니다!
'back > Java' 카테고리의 다른 글
KH 23일차(AWT) (0) | 2022.08.01 |
---|---|
KH 22일차(HashMap, TreeSet) (0) | 2022.07.30 |
KH 20일차(StringBuffer, Vector, ArrayList, StringTokenizerTest) (1) | 2022.07.27 |
KH 19일차(String 객체, Sorting, substring, indexOf, charAt) (0) | 2022.07.26 |
KH 18일차(Wrapper class) (0) | 2022.07.25 |