티스토리 뷰
1. 아래의 출력이 나오도록 만드시오.
public class HashPerson {
public static void main(String[] args) {
HashSet<Person> hSet = new HashSet<Person>();
hSet.add(new Person("LEE", 10));
hSet.add(new Person("LEE", 10));
hSet.add(new Person("PARK", 35));
hSet.add(new Person("PARK", 35));
System.out.println("저장된 데이터 수: " + hSet.size());
//System.out.println(hSet);
}
}
/*
저장된 데이터 수: 2
[LEE(10세), PARK(35세)]
*/
import java.util.HashSet;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return (age / 10);
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Person) {
Person person = (Person)obj;
if((this.name.equals(person.name)) && (this.age == person.age))
return true;
}
return false;
}
@Override
public String toString() {
return name + "(" + age + "세)";
}
}
class HashPerson {
public static void main(String[] args) {
HashSet<Person> hSet = new HashSet<Person>();
hSet.add(new Person("LEE", 10));
hSet.add(new Person("LEE", 10));
hSet.add(new Person("PARK", 35));
hSet.add(new Person("PARK", 35));
System.out.println("저장된 데이터 수: " + hSet.size());
System.out.println(hSet);
}
}
/*
* 저장된 데이터 수: 2
* [LEE(10세), PARK(35세)]
*/
2. 아래와 같이 출력이 나오도록 프로그래밍을 하시오.
HashSet<Num> set = new HashSet<>();
set.add(new Num(7799));
set.add(new Num(9955));
set.add(new Num(7799));
System.out.println("인스턴스 수: " + set.size());
for(Num n : set)
System.out.print(n.toString() + '\t');
System.out.println();
/*
====출력
인스턴스 수: 2
7799 9955
*/
import java.util.HashSet;
class Num{
private int num;
public Num(int n) {
this.num = n;
}
@Override
public String toString() {
return String.valueOf(num); // int를 String으로 변환
}
// 1. hashCode() - 해쉬 알고리즘 - 분류한다(속도). 분류만 하기때문에 같은지 확인 불가
@Override
public int hashCode() {
return num % 3;
} // hashCode 먼저 호출
// 2. 동일한지 비교를 위해 true면 동일, false면 다름 (로직은 개발자가 직접 짜야한다.)
@Override
public boolean equals(Object obj) {
if(this.num == ((Num)obj).num)
return true;
else
return false;
} // hashCode 실행 후 호출 됨. 같은지 확인한다.
// hashCode()나 equals() 둘 중 하나만 있으면 중복이 제거되지 않는다...3개 출력
}
public class HashSetEqualityTwo {
public static void main(String[] args) {
HashSet<Num> set = new HashSet<>();
// set.add을 하게 되면 set이 알아서 hashCode() 호출! 그 다음 자동으로 equals()실행
set.add(new Num(7799));
set.add(new Num(9955));
set.add(new Num(7799));
System.out.println("인스턴스 수: " + set.size());
for (Num n : set) {
System.out.print(n.toString() + "\t");
} // Set은 넣었던 순서는 상관없이 출력된다....
}
}
위에서 왜 hashcode를 오버라이딩 하지 않으면 중복 제거가 되지 않을까??
3.ThreeSet 과 HashSet 의 차이는?
HashSet의 경우 순서대로 정렬이 되지 않지만(넣어준 순서대로 출력되지 않는다) TreeSet은 오름차순으로 출력할 수 있다.
내림차순으로 변경하고 싶다면 implements Comparable<T>을 해준 후
compareTo 함수를 오버라이딩 해야한다.
import java.util.HashSet;
import java.util.TreeSet;
class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person o) {
// return this.age - o.age; 오름차순
return o.age - this.age 내림차순
}
@Override
public String toString() {
return name + "(" + age + "세)";
}
@Override
public int hashCode() {
return age; // return (age / 10); 10대, 20대 등으로 분류하겠다.
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Person) {
Person person = (Person) obj;
if (this.name.equals(person.name) && (this.age == (person.age)))
return true;
}
return false;
}
}
public class HashCodeTest {
public static void main(String[] args) {
TreeSet<Person> tree = new TreeSet<>();
tree.add(new Person("YOON", 37));
tree.add(new Person("HONG", 53));
tree.add(new Person("PARK", 22));
for (Person person : tree) {
System.out.print(person + "\t");
}
}
}
/*
* PARK(22세) YOON(37세) HONG(53세)
*/
4.하나의 학생 정보를 나타내는 Student 클래스에는 이름, 학과, 학번, 학점 평균을 저장하는 필드가 있다.
(1) 학생마다 Student 객체를 생성하고 4명의 학생 정보를 ArrayList<Student> 컬렉션에 저장한 후에, ArrayList<Student>의 모든 학생(4명) 정보를 출력하고 학생 이름을 입력받아 해당 학생의 학점 평균을 출력하는 프로그램을 작성하라.
학생 이름, 학과, 학번, 학점평균 입력하세요.
>> 황기태, 모바일, 1, 4.1
>> 이재문, 안드로이드, 2, 3.9
>> 김남윤, 웹공학, 3, 3.5
>> 최찬미, 빅데이터, 4, 4.25
----------------------------------
이름: 황기태
학과: 모바일
학번: 1
학점평균: 4.1
----------------------------------
이름: 이재문
학과: 안드로이드
학번: 2
학점평균: 3.9
----------------------------------
이름: 김남윤
학과: 웹공학
학번: 3
학점평균: 3.5
----------------------------------
이름: 최찬미
학과: 빅데이터
학번: 4
학점평균: 4.25
----------------------------------
학생 이름 >> 최찬미
최찬미, 빅데이터, 4, 4.25
학생 이름 >> 이재문
이재문, 안드로이드, 2, 3.9
학생 이름 >> 그만
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Student {
private String name;
private String major;
private int stuNum;
private double gradeAvg;
List<Student> list = new ArrayList<>();
public Student(String name, String major, int stuNum, double gradeAvg) {
this.name = name;
this.major = major;
this.stuNum = stuNum;
this.gradeAvg = gradeAvg;
}
public Student() {
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "이름:" + name + "\n" + "학과:" + major + "\n" + "학번:" + stuNum + "\n" + "학점평균:" + gradeAvg;
}
public void getAll() {
System.out.println(name + ", " + major + ", " + stuNum + ", " + gradeAvg);
}
public String getName() {
return name;
}
public void setStuInfo() {
Scanner sc = new Scanner(System.in);
System.out.println("학생 이름, 학과, 학번, 학점평균 입력하세요.");
try {
for (int i = 0; i < 4; i++) {
System.out.print((i + 1) + "번 >> ");
String name = sc.next();
String major = sc.next();
int stuNum = sc.nextInt();
double gradeAvg = sc.nextDouble();
Student student = new Student(name, major, stuNum, gradeAvg);
list.add(student);
}
} catch (Exception e) {
System.out.println("잘못된 입력입니다. 다시 입력해 주세요.");
setStuInfo();
}
}
public void printStuInfoAll() {
for (int i = 0; i < 4; i++) {
System.out.println(list.get(i));
System.out.println();
}
}
public boolean getStuInfo() {
Scanner sc = new Scanner(System.in);
System.out.print("학생 이름 (종료를 원하시면 '그만'을 입력하세요.) >> ");
String name = sc.next();
if (name.equals("그만")) {
System.out.println("종료합니다.");
return false;
}
for (int i = 0; i < 4; i++) {
if (name.equals(list.get(i).getName()))
list.get(i).getAll();
}
return true;
}
}
class StudentGradeTest {
public static void main(String[] args) {
Student stu = new Student();
stu.setStuInfo();
stu.printStuInfoAll();
boolean boo = true;
while(boo) {
boo = stu.getStuInfo();
}
}
}
클래스로 만들어서 객체 생성!......따로 입력 받는 거 말고 nextline 사용하고 싶은데 오류 발생.....
됐다?!?! 일단 정상 출력 확인
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
class Student {
private String name;
private String major;
private String stuNum;
private String gradeAvg;
List<Student> list = new ArrayList<>();
public Student(String name, String major, String stuNum, String gradeAvg) {
this.name = name;
this.major = major;
this.stuNum = stuNum;
this.gradeAvg = gradeAvg;
}
public Student() {
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "이름:" + name + "\n" + "학과:" + major + "\n" + "학번:" + stuNum + "\n" + "학점평균:" + gradeAvg;
}
public void getAll() {
System.out.println(name + ", " + major + ", " + stuNum + ", " + gradeAvg);
}
public String getName() {
return name;
}
public void setStuInfo() {
Scanner sc = new Scanner(System.in);
System.out.println("학생 이름, 학과, 학번, 학점평균 입력하세요.");
for (int i = 0; i < 4; i++) {
System.out.print((i + 1) + "번 >> ");
String info = sc.nextLine();
StringTokenizer st = new StringTokenizer(info, ", ");
while(st.hasMoreTokens()) {
list.add(new Student(st.nextToken(), st.nextToken(), st.nextToken(), st.nextToken()));
}
}
}
public void printStuInfoAll() {
for (int i = 0; i < 4; i++) {
System.out.println(list.get(i));
System.out.println();
}
}
public boolean getStuInfo() {
Scanner sc = new Scanner(System.in);
System.out.print("학생 이름 (종료를 원하시면 '그만'을 입력하세요.) >> ");
String name = sc.next();
if (name.equals("그만")) {
System.out.println("종료합니다.");
return false;
}
for (int i = 0; i < 4; i++) {
if (name.equals(list.get(i).getName()))
list.get(i).getAll();
}
return true;
}
}
class StudentGradeTest {
public static void main(String[] args) {
Student stu = new Student();
stu.setStuInfo();
stu.printStuInfoAll();
boolean boo = true;
while(boo) {
boo = stu.getStuInfo();
}
}
}
난 왜 이렇게 짰지...ㅋㅋ.....선생님이랑 너무 다르네..........
import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;
class Student {
private String name;
private String dept;
private String number;
private double grade;
public Student(String name, String dept, String number, double grade) {
this.name = name;
this.dept = dept;
this.number = number;
this.grade = grade;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public double getGrade() {
return grade;
}
public void setGrade(double grade) {
this.grade = grade;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void findStudent(String name) {
if(this.name.equals(name)) {
System.out.println(this.name + ", " + this.dept + ", " + this.number + ", " + this.grade);
}
}
}
class StudentGradeTest {
public static void main(String[] args) {
final int STU_NUM = 4;
Scanner sc = new Scanner(System.in);
System.out.println("학생 이름, 학과, 학번, 학점평균 입력하세요.");
ArrayList<Student> arrList = new ArrayList<>();
for(int i = 0; i < STU_NUM; i++) {
System.out.print(">> ");
String text = sc.nextLine();
StringTokenizer st = new StringTokenizer(text, ",");
// nestLine이 space 단위로 끊어 인식하기 때문에 ,하나만 조건으로 넣어줘도 된다.
String name = st.nextToken().trim(); // trim() 앞뒤 공백으로 자르는 것! 실무에서 자주 사용
String dept = st.nextToken().trim();
String num = st.nextToken().trim();
double grade = Double.valueOf(st.nextToken().trim());
arrList.add(new Student(name, dept, num, grade));
}
for(int i = 0; i < arrList.size(); i++) {
System.out.print("------------------------");
Student student = arrList.get(i);
System.out.println("이름: " + student.getName());
System.out.println("학과: "+ student.getDept());
System.out.println("학번: "+ student.getNumber());
System.out.println("학점평균: "+ student.getGrade());
}
System.out.print("------------------------------------");
while(true) {
System.out.println("학생 이름 >> ");
String name = sc.next();
if(name.equals("그만"))
break;
for(int i = 0; i < arrList.size(); i++) {
Student s = arrList.get(i);
s.findStudent(name);
}
}
System.out.println("종료");
}
}
5. 개별 진척도 오늘 못한거 정리 해 주세요.
'수업문제' 카테고리의 다른 글
[문제] 11월 11일(프로세스, 쓰레드, 동기화, display) (0) | 2021.11.11 |
---|---|
[문제] 11월 10일 (Map, Stack, Queue) (0) | 2021.11.11 |
[문제] 11월 8일 (ArrayList 와 LinkedList, Set, 선택자, 하이 서울 브랜드) (0) | 2021.11.08 |
[문제] 11월 5일 (블록 태그, 인라인 태그, 선택자, ArrayList 와 LinkedList, 홀리그램) (1) | 2021.11.05 |
- Total
- Today
- Yesterday
- TreeSet
- 세션
- 제네릭
- SOCKET
- string
- 입출력
- object
- 쓰레드
- 참조형
- 부트스트랩
- compareTo
- abstract
- Generic
- equals
- Request
- el
- hashset
- 진척도 70번
- 예외처리
- 쿠키
- 프로토콜
- 래퍼 클래스
- 사칙연산 계산기
- response
- 채팅
- JSP
- exception
- Servlet
- Session
- toString
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |