🟢 List를 초기화 안해주고 add시 에러남
Set : 중복을 허용하지 않는 List (인덱스 개념이 없어서 인덱싱 메소드가 없음)
HashSet : 순서없이 값을 저장하며, 동일한 객체는 중복 저장하지 않음
TreeSet : 객체를 저장하면 자동 정렬됨
🟢 메소드
add(데이터) : 데이터 추가remove(데이터) : 데이터 삭제clear() : 전체 삭제public class SetExercise {
public static void main(String[] args) {
Set<String> set1 = new HashSet<>(); // tree set도 있음
set1.add("고관운");
set1.add("고관운");
set1.add("김미미");
System.out.println(set1);
// 정수 중복 제거
Set<Integer> setInteger = new HashSet<>();
setInteger.add(1);
setInteger.add(1);
setInteger.add(2);
setInteger.add(3);
System.out.println(setInteger);
}
}
🟢 set1은 고관운이 중복되므로 중복 저장 안됨
🟢 setInteger 역시 1이 중복되어 1,2,3만 저장됨
public interface NumberGenerator1 {
int generate(int num);
}
public class RandomNumberGenerator1 implements NumberGenerator1{
@Override
public int generate(int num) {
return (int)(Math.random() * num);
}
}
🟢 인터페이스 NumberGenerator1을 받아 generate 오버라이딩
import java.util.HashSet;
import java.util.Set;
public class RndNumberWithoutDuplicated {
public static void main(String[] args) {
RandomNumberGenerator1 randomNumberGenerator = new RandomNumberGenerator1();
Set<Integer> rndNumWithoutDuplicated = new HashSet<>();
System.out.print("랜덤한 수(50개) : ");
for(int i = 0; i < 50; i++) {
int rndNum = randomNumberGenerator.generate(10);
System.out.print(rndNum + " ");
rndNumWithoutDuplicated.add(rndNum);
}
System.out.print("\n랜덤한 수 중복제거 : ");
for (Integer integer : rndNumWithoutDuplicated) {
System.out.print(integer + " ");
}
}
}
🟢 비교를 위해 랜덤한 수 50개 출력 후 Set에 넣어 중복 제거 후 출력
방식은 위의 문제와 동일하기 때문에 랜덤한 알파벳 생성하는 함수만 확인
public class RandomAlphabetGenerator implements AlphabetGenerator{
@Override
public char generate() {
return (char) ((int) (Math.random() * 26) + 65);
}
}
🟢 ((int) (Math.random() * 26) + 65) : 아스키코드 65이상 91미만인 수를 가져와 (char)로 형변환하여 리턴
Map : Key와 Value로 구성된 객체를 저장하는 구조
🟢 메소드
put(a,b) : key : a, value : b로 Map에 들어감get(a) : key가 a에 해당하는 value를 가져옴containsKey(a) : Map이 a라는 키를 가지고 있다면 True 리턴public class IsAlphabet {
boolean checkIsAlphabet(char c){
if ((c >= 65 && c <= 90) || (c >= 97 && c <= 122)){
return true;
} else{
return false;
}
}
}
🟢 c가 알파벳이면 true, 아니면 false 리턴
import java.util.HashMap;
public class MapExercise {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("권하준", "https://github.com/dongyeon-0822/java-project-exercise");
map.put("조성윤", "https://github.com/kang-subin/Java");
map.put("안예은", "https://github.com/KoKwanwun/LikeLion.git");
// get으로 key 값에 해당하는 value값을 가져옴
// System.out.println(map.get("권하준"));
for (String s : map.keySet()) {
System.out.println("이름 : " + s + ", 깃주소 : " + map.get(s));
}
System.out.println("총 개수 : " + map.size());
// 깃주소를 하나 가져와서 문자별로 개수 출력
IsAlphabet isAlphabet = new IsAlphabet();
HashMap<Character, Integer> alphabetCnt = new HashMap<>();
HashMap<Character, Integer> charCnt = new HashMap<>();
int cnt = 0;
String strs = map.get("권하준");
System.out.println("\n권하준의 깃주소 문자별 개수 출력");
for (int i = 0; i < strs.length(); i++){
char chr = strs.charAt(i);
if (isAlphabet.checkIsAlphabet(chr)){
cnt = alphabetCnt.containsKey(chr) ? alphabetCnt.get(chr) : 0;
alphabetCnt.put(chr, cnt + 1);
} else {
cnt = charCnt.containsKey(chr) ? charCnt.get(chr) : 0;
charCnt.put(chr, cnt + 1);
}
}
System.out.println("알파벳별 개수 : " + alphabetCnt);
System.out.println("알파벳이 아닌 문자별 개수 : " + charCnt);
}
}
🟢 put으로 데이터를 넣고 get으로 value값을 가져옴
🟢 checkIsAlphabet 함수를 통해 알파벳인지 확인
🟢 alphabetCnt.containsKey(chr) ? alphabetCnt.get(chr) : 0 chr을 key로 가지고 있다면 그에 해당하는 value를 가져오고 아니라면 0을 가져옴
FileReader : character 파일을 읽을 수 있는 기능(String을 character로 여러번 부를 수 있음)BufferedReader : buffer를 사용하면 FileReader보다 좀 더 효율적으로 읽어올 수 있음import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
public class ReadFileByByte {
private String filename;
public ReadFileByByte(String filename) {
this.filename = filename;
}
char readOneByte() throws IOException {
BufferedReader br = new BufferedReader(
new FileReader(filename),
16 * 1024
);
return (char)br.read();
}
String readTwoByte() throws IOException {
BufferedReader br = new BufferedReader(
new FileReader(filename),
16 * 1024
);
String nByte = br.readLine();
int n = 2;
if (nByte.length() < n){
n = nByte.length();
}
return nByte.substring(0,n);
}
String readNByte(int n) throws IOException {
BufferedReader br = new BufferedReader(
new FileReader(filename),
16 * 1024
);
String nByte = br.readLine();
if (nByte.length() < n){
n = nByte.length();
}
return nByte.substring(0,n);
}
}
🟢 효율적으로 파일을 읽기 위해 BufferedReader 사용
🟢 한글자를 읽어올 때는 read사용
🟢 두글자, N글자는 readLine사용(N글자를 읽어올 때는 N이 한줄의 크기보다 클 수 있기 때문에 처리해줌)
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ReadLine {
private String filename;
public ReadLine(String filename) {
this.filename = filename;
}
public String readOneLine() throws IOException {
BufferedReader br = new BufferedReader(
new FileReader(filename),
16 * 1024
);
return br.readLine();
}
public List<String> readNLine(int n) throws IOException {
BufferedReader br = new BufferedReader(
new FileReader(filename),
16 * 1024
);
List<String> strs = new ArrayList<>();
for(int i = 0; i < n; i++){
String str = br.readLine();
if (str == null){
break;
}
strs.add(str);
}
return strs;
}
}
🟢 한줄은 readLine()으로 리턴
🟢 N줄은 List를 만들어 한줄씩 넣어주고 리턴
public class ReadLineMain {
public static void main(String[] args) throws IOException {
ReadLine readLine = new ReadLine("c_file.txt");
System.out.println("한줄만 읽기");
System.out.println(readLine.readOneLine());
List<String> strs = new ArrayList<>();
strs = readLine.readNLine(8);
System.out.println("\nN줄 읽기");
for (String str : strs) {
System.out.println(str);
}
}
}
🟢 N줄은 리스트 형식으로 받아서 for문을 통해 출력