Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[5기] 3주차 Wordle 과제 제출 - 우지 #32

Open
wants to merge 91 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
e62f3b3
test: wordList에 주어진 단어 있는지 검증 추가
padoling Jun 8, 2024
2f990b0
test: wordList에 주어진 단어 없는지 검증 추가
padoling Jun 8, 2024
ca2a8b3
feat: wordList 주어진 단어 검증 로직 작성
padoling Jun 8, 2024
478f587
test: Selector가 주어진다면 조건에 해당하는 단어를_추출할 수 있다
kwj1270 Jun 8, 2024
f7daed8
feat: Selector가 주어진다면 조건에 해당하는 단어를_추출할 수 있다
kwj1270 Jun 8, 2024
cfd46de
test: Selector가 주어졌지만 조건에 해당하는 단어가 없다면 예외를 발생한다
kwj1270 Jun 8, 2024
280fae8
test: Guess에 소문자가 아닌 문자가 들어오면 예외 발생 테스트 추가
padoling Jun 8, 2024
b942322
feat: Guess에 소문자가 아닌 문자가 들어오면 예외 발생 로직 추가
padoling Jun 8, 2024
52437ca
test: Guess에 소문자 문자만 들어오면 생성할 수 있다.
kwj1270 Jun 8, 2024
08b9535
test: Word에 주어진 단어가 5글자가 아니라면 예외를 발생한다
kwj1270 Jun 8, 2024
571b8dd
feat: Word에 주어진 단어가 5글자가 아니라면 예외를 발생한다
kwj1270 Jun 8, 2024
83a0887
refactor: WordListTest 에 있는 Word 단위 테스트 WordTest 로 이동
kwj1270 Jun 8, 2024
db2dcf4
refactor: Guess 에 있는 테스트 및 검증 책임 Word 로 이전
kwj1270 Jun 8, 2024
c9153f3
test: 날짜 기반 단어 선택기는 주어진 날짜를 기준으로 단어를 선택할 수 있다
kwj1270 Jun 9, 2024
f69ee03
feat: 날짜 기반 단어 선택기는 주어진 날짜를 기준으로 단어를 선택할 수 있다
kwj1270 Jun 9, 2024
acdfe49
test: 정답과 동일한 답안이 들어오면 모두 MATCHED인 결과를 반환하는 테스트 추가
padoling Jun 9, 2024
ee09463
feat: 정답과 동일한 답안이 들어오면 모두 MATCHED인 결과를 반환하는 기능 추가
padoling Jun 9, 2024
ebce98e
test: 모든 ResultType이 Matched라면 매칭 성공 여부를 true로_반환하는 테스트 추가
kwj1270 Jun 9, 2024
90055f2
feat: 모든 ResultType이 Matched라면 매칭 성공 여부를 true로_반환하는 기능 추가
kwj1270 Jun 9, 2024
2b8a2a4
feat: View 및 Controller 기능 구현
kwj1270 Jun 9, 2024
de9a13a
feat: Results 클래스로 result list 래핑 및 game 종료 로직 수정
padoling Jun 12, 2024
a221c62
feat: Results 출력시 실제 색상을 표현하도록 기능 추가
kwj1270 Jun 12, 2024
b36bf1a
test: 단어장이 존재한다면 특정 조건을 통해 정답을 추출할 수 있다
kwj1270 Jun 12, 2024
f7d268f
feat: 단어장이 존재한다면 특정 조건을 통해 정답을 추출할 수 있다
kwj1270 Jun 12, 2024
43f4346
refactor: Answer 의존성 분리 및 WordList 에서 Word 조회로 변경
kwj1270 Jun 12, 2024
1e6b212
feat: 사용자 입력 단어가 단어장에 없을 경우 재시도 요청 기능 추가
kwj1270 Jun 12, 2024
7890f46
refactor: 사용자 입력 문자열을 Guess로 변환
padoling Jun 12, 2024
b634c0b
refactor: 패키지 분리
padoling Jun 12, 2024
a649fd5
refactor: 최대 시도 횟수를 Game에서만 관리하도록 수정
padoling Jun 12, 2024
92656af
refactor: 단어장에서 정답 생성 인터페이스 상위 호출로 수정
kwj1270 Jun 12, 2024
3c78afe
refactor: takeWhile 사용하여 결과 출력하도록 로직 수정
kwj1270 Jun 12, 2024
9f7d1c0
test : 문자가 모두 일치하는 결과가 있는 경우 true를 반환한다.
padoling Jun 13, 2024
924d38c
test : 문자가 모두 일치하는 결과가 없는 경우 false를 반환한다.
padoling Jun 13, 2024
b52c6c7
refactor: 시도 횟수에 따라 게임이 종료됐는지 확인하는 로직 분리
padoling Jun 13, 2024
20c1ee4
test: 모든 ResultType이 Matched가 아니라면 매칭 성공 여부를 false로 반환한다
kwj1270 Jun 13, 2024
4e1ea71
refactor: WordList 내부에 도메인 로직 보강
kwj1270 Jun 13, 2024
cc09f14
refactor: 결과 색깔 표시 클래스 및 게임 안내 메시지 상수로 분리
padoling Jun 13, 2024
1e80356
refactor: 오타 수정 및 예외 로직 수정
padoling Jun 13, 2024
7de17cc
test: 소문자 영단어로 Alphabet을 생성할 수 있다
kwj1270 Jun 13, 2024
48ed3b1
feat: 소문자 영단어로 Alphabet을 생성할 수 있다
kwj1270 Jun 13, 2024
9787aef
test: 소문자가 아닌 단어가 들어온다면 Alphabet을 생성할 수 없다
kwj1270 Jun 13, 2024
ea46eb5
refactor: Word 내부 의존성을 Alphabet 리스트로 변경
kwj1270 Jun 13, 2024
fbe7a1e
fix: WordList 예외 검증 로직 수정으로 인한 Exception 타입 변경
kwj1270 Jun 13, 2024
7a2caa8
fix: 다음 문자 입력 조건식 버그 수정
kwj1270 Jun 15, 2024
afbfdd5
refactor: 단순 문자열 반환을 알파벳 리스트로 반환하도록 수정
kwj1270 Jun 15, 2024
57f7b06
refactor: 문자열 반환을 알파벳 리스트 반환하는 로직으로 수정
kwj1270 Jun 15, 2024
4a9c8f5
fix: 시간 기반 답안 선택기 답안 선택 규칙 초에서 일 단위로 수정
padoling Jun 15, 2024
2dcb810
wip: 단어와 추측 및 답안 추상화 분리 진행 중
padoling Jun 15, 2024
9aa9f6f
wip: Word 구조 변경 및 컴파일 에러 해결
kwj1270 Jun 15, 2024
fe243e0
refactor: guess 및 answer word 합성 구조로 개선
padoling Jun 15, 2024
de3dcd9
fix: 입력받은 답안이 wordList에 존재하는지 검사하는 기능 버그 픽스
padoling Jun 15, 2024
ef9b336
refactor: test 코드 production 코드로 이관
kwj1270 Jun 15, 2024
60a0d8f
refactor: final 타입 지정 및 코드 스타일 개선
kwj1270 Jun 15, 2024
9d00615
test: 답안은 5글자가 아니면 예외를 발생한다
kwj1270 Jun 17, 2024
a759ed7
feat: 답안은 5글자가 아니면 예외를 발생한다
kwj1270 Jun 17, 2024
3ec118d
test: 알파벳과 인덱스가 들어오면 해당 인덱스 이전의 알파벳 개수를 반환한다
kwj1270 Jun 17, 2024
6c1f76e
feat: 알파벳과 인덱스가 들어오면 해당 인덱스 이전의 알파벳 개수를 반환한다
kwj1270 Jun 17, 2024
63e9340
refactor: 인덱스 길이 상수화 및 변수명 수정
kwj1270 Jun 17, 2024
58f7569
test: 인덱스가 들어오면 해당 인덱스의 알파벳을 반환한다
kwj1270 Jun 17, 2024
50d084f
test: 알파벳 조회시 답안 길이보다 긴 인덱스가 들어오면 예외를 발생한다
kwj1270 Jun 17, 2024
d7ac95e
refactor: Java 코드 컨벤션 적용 및 일부 네이밍 수정
kwj1270 Jun 17, 2024
d32d773
test: 결과들을 가지고 있다면 개수를 반환할 수 있다
kwj1270 Jun 17, 2024
3178ff5
test: 정답은 5글자가 아니면 예외를 발생한다
kwj1270 Jun 17, 2024
a955693
test: 정답은 알파벳과 인덱스가 들어오면 해당 인덱스 이전의 알파벳 개수를 반환한다
kwj1270 Jun 17, 2024
05ba0a5
test: 답안 길이보다 긴 인덱스가 들어오면 예외를 발생한다
kwj1270 Jun 17, 2024
fbda6b0
test: 인덱스가 들어오면 해당 인덱스의 알파벳을 반환한다
kwj1270 Jun 17, 2024
4403628
test: 알파벳 조회시 답안 길이보다 긴 인덱스가 들어오면 예외를 발생한다
kwj1270 Jun 17, 2024
f6fc514
docs: README 작성
padoling Jun 17, 2024
db80ad7
docs: README 수정
padoling Jun 17, 2024
d0ac6e8
refactor: 자바 코딩 컨벤션 추가 적용
kwj1270 Jun 17, 2024
8cdbedb
fix: 게임 단어에 5글자가 아닌 문자열이 들어오면 발생하는 에러 타입 수정
kwj1270 Jun 17, 2024
166150e
Merge branch 'main' of https://github.com/padoling/java-wordle into w…
kwj1270 Jun 17, 2024
acc82c5
refactor: 불필요한 메서드 삭제 및 네이밍 수정
kwj1270 Jun 17, 2024
79edbf7
refactor: 코드 스타일에 대한 리뷰 내용 반영
kwj1270 Jun 23, 2024
f89b99c
refactor: Word 추상화 및 DictionaryWord 와 GameWord 로 분리
kwj1270 Jun 24, 2024
38dec0d
refactor: Attempt 의존도 최소화하도록 수정
kwj1270 Jun 24, 2024
82a762d
refactor: WordSelector 네이밍 수정
kwj1270 Jun 24, 2024
bf21ade
refactor: enum 타입 비교문 equals 로 통일
kwj1270 Jun 25, 2024
03fc9c1
fix: 매칭 타입 단어와 동일한 단어가 앞에 존재할 경우 미존재 타입으로_처리한다
kwj1270 Jun 25, 2024
fbb1f8c
test: Alphabet 클래스 단위 테스트 소스 보강
kwj1270 Jun 25, 2024
a8d8bd2
test: Result 클래스 단위 테스트 소스 보강
kwj1270 Jun 25, 2024
d853bad
test: GameWord 클래스 단위 테스트 소스 보강
kwj1270 Jun 25, 2024
d091299
test: DictionaryReader 클래스 단위 테스트 소스 보강
kwj1270 Jun 25, 2024
a91a561
test: DictionaryWord 클래스 단위 테스트 소스 보강
kwj1270 Jun 25, 2024
ece84a3
test: Guess 클래스 단위 테스트 소스 보강
kwj1270 Jun 25, 2024
6fa1d40
test: Answer 클래스 단위 테스트 소스 보강
kwj1270 Jun 25, 2024
1efe596
test: Results 클래스 단위 테스트 소스 보강
kwj1270 Jun 25, 2024
102dd6e
refactor: 코드 컨벤션 및 불필요 의존성 제거
kwj1270 Jun 25, 2024
774a9bc
refactor: 소문자 문구 제거
kwj1270 Jun 25, 2024
6b70b33
refactor: Answer 상수 접근 제어자 변경
kwj1270 Jun 25, 2024
dd70ea8
fix: 요구사항에 맞지 않는 단어 입력시 재입력 문구 출력하도록 수정
kwj1270 Jun 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
240 changes: 161 additions & 79 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,89 +1,171 @@
# 미션 - 워들

## 🔍 진행 방식

- 미션은 **과제 진행 요구 사항**, **기능 요구 사항**, **프로그래밍 요구 사항** 세 가지로 구성되어 있다.
- 세 개의 요구 사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다.
- **기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다.**
- 참여자 : 우지, 구월

## 시퀀스 다이어그램
kwj1270 marked this conversation as resolved.
Show resolved Hide resolved
```mermaid
sequenceDiagram
actor User
participant OutputView
participant InputView
participant Game
Note right of Game: 게임 시작

Game ->> OutputView: User 에게 환영 문구를 보여줘라
OutputView ->> User: WORDLE을 6번 만에 맞춰 보세요.<br>시도의 결과는 타일의 색 변화로 나타납니다.
Game ->> WordListReader: 사전 요청
WordListReader ->> Game: 사전 응답
Game ->> WordList: 정답 요청
WordList ->> Game: 정답 응답
loop 게임시작 6라운드
loop 단어 검증
Game ->> OutputView: 정답 입력 문구를 보여줘라
OutputView ->> User: 정답을 입력해 주세요.
User ->> InputView: 예상 단어 입력
InputView->>Game: 예상 단어 입력
activate Game
Game->>WordList: 단어 확인
WordList->>Game: 단어 확인 결과
alt is 잘못된 단어
Game ->> OutputView: 잘못된 단어라고 알려줘라
OutputView ->> User: 잘못된 단어를 입력하셨습니다.
else is 올바른 단어
end
end
Game ->> Word: 정답인지 확인해라
Word ->> Answer: 체점해줘
Answer ->> Word: 체점완료
Word ->> Game: 정답 결과 반환
Game ->> Results: 정답인가?
Results ->> Game: 정답여부 반환

break when Results 가 정답일 경우
Game ->> OutputView: 결과를 화면에 나타내라
OutputView ->> User: 4/6<br> [1][1][1][1][1][1]
Note right of Game: 게임 종료
end
Game ->> Results: 기회를 다 사용했는가?
Results ->> Game: 기회 사용 여부 반환
break when 기회를 다 사용했다면
Game ->> OutputView: 결과를 화면에 나타내라
OutputView ->> User: 6/6<br> [1][1][1][1][1][0]
Note right of Game: 게임 종료
end
deactivate Game
end
```

---

## 🚀 기능 요구 사항

선풍적인 인기를 끌었던 영어 단어 맞추기 게임이다.

- 6x5 격자를 통해서 5글자 단어를 6번 만에 추측한다.
- 플레이어가 답안을 제출하면 프로그램이 정답과 제출된 단어의 각 알파벳 종류와 위치를 비교해 판별한다.
- 판별 결과는 흰색의 타일이 세 가지 색(초록색/노란색/회색) 중 하나로 바뀌면서 표현된다.
- 맞는 글자는 초록색, 위치가 틀리면 노란색, 없으면 회색
- 두 개의 동일한 문자를 입력하고 그중 하나가 회색으로 표시되면 해당 문자 중 하나만 최종 단어에 나타난다.
- 정답과 답안은 `words.txt`에 존재하는 단어여야 한다.
- 정답은 매일 바뀌며 ((현재 날짜 - 2021년 6월 19일) % 배열의 크기) 번째의 단어이다.

### 입출력 요구 사항

#### 실행 결과 예시

## 클래스 설계

### view

```mermaid
classDiagram
class Game {
start()
}
class InputView {
Scanner scanner
Word inputWord()
}
class OutputView {
void welcome()
void insertWord()
void wrongWord()
void showResults(Results results)
}
class enum ResultColor {
String color // 🟩, 🟨, ⬜
ResultType type

String color(ResultType type)
}
```
WORDLE을 6번 만에 맞춰 보세요.
시도의 결과는 타일의 색 변화로 나타납니다.
정답을 입력해 주세요.
hello

⬜⬜🟨🟩⬜

정답을 입력해 주세요.
label

⬜⬜🟨🟩⬜
🟨⬜⬜⬜🟩

정답을 입력해 주세요.
spell

⬜⬜🟨🟩⬜
🟨⬜⬜⬜🟩
🟩🟩⬜🟩🟩

정답을 입력해 주세요.
spill

4/6

⬜⬜🟨🟩⬜
🟨⬜⬜⬜🟩
🟩🟩⬜🟩🟩
🟩🟩🟩🟩🟩
### Word

```mermaid
classDiagram
Answer -- WordSelector
class Word {
List<Alphabet> alphabets
}
Word -- Alphabet
class Alphabet {

}
Word <|-- Answer
class Answer {
Word word
Result examineResult(Guess guess)
}
class EpochDayBaseAnswerSelector {
Word select()
}
class WordSelector {
Word select()
}
WordSelector <|-- EpochDayBaseAnswerSelector

Word <|-- Guess
class Guess {
Word word
}

class WordList {
Word find(Word word)
Word select(Selector selector)
}

class WordListReader {
WordList read()
}
class WordListFileReader {
WordList read()
}
WordListReader <|-- WordListFileReader
WordList -- WordListReader
```

### Result

```mermaid
classDiagram
class Result {
List<ResultType> resultTypes
boolean allMatched()
}

class Results {
List<Result> resultList
boolean hasAnswer()
}

class enum ResultType {
char type // MATCHED, EXIST, MISMATCHED
}
```
---

## 🎯 프로그래밍 요구 사항

- JDK 21 버전에서 실행 가능해야 한다.
- 프로그램 실행의 시작점은 `Application`의 `main()`이다.
- `build.gradle` 파일은 변경할 수 없으며, **제공된 라이브러리 이외의 외부 라이브러리는 사용하지 않는다.**
- 프로그램 종료 시 `System.exit()`를 호출하지 않는다.
- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 등의 이름을 바꾸거나 이동하지 않는다.
- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- 기본적으로 [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html)를 원칙으로 한다.
- 단, 들여쓰기는 '2 spaces'가 아닌 '4 spaces'로 한다.
- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.
- 3항 연산자를 쓰지 않는다.
- 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
- JUnit 5와 AssertJ를 이용하여 정리한 기능 목록이 정상적으로 작동하는지 테스트 코드로 확인한다.
- 테스트 도구 사용법이 익숙하지 않다면 아래 문서를 참고하여 학습한 후 테스트를 구현한다.
- [JUnit 5 User Guide](https://junit.org/junit5/docs/current/user-guide)
- [AssertJ User Guide](https://assertj.github.io/doc)
- [AssertJ Exception Assertions](https://www.baeldung.com/assertj-exception-assertion)
- [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5)
- 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
- 함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다.
- else 예약어를 쓰지 않는다.
- else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.
- 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
- 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다.
- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다.
- 힌트: MVC 패턴 기반으로 구현한 후, View와 Controller를 제외한 Model에 대한 단위 테스트 추가에 집중한다.
## 테스트케이스

- Game
- [x] 게임은 지정된 횟수만큼 입력받고 종료된다.
- Word
- [x] 단어에 알파벳 소문자가 아닌 문자가 들어오면 예외를 반환한다.
- [x] 단어는 5글자이다.
- [x] 단어가 5글자가 아니면 예외를 반환한다.
- Answer
- [x] 정답은 답안을 기반으로 결과를 반환할 수 있다.
- AnswerSelector
- [x] 정답은 매일 바뀌며 `((현재 날짜 - 2021년 6월 19일) % 배열의 크기)` 번째의 단어이다.
- WordList
- [x] 주어진 단어가 WordList 안에 있으면 true를 반환한다.
- [x] 주어진 단어가 WordList 안에 없으면 false를 반환한다.
- [x] 주어진 Selector의 조건에 해당하는 단어를 추출한다.
- Result
- [x] 판별 결과는 세 가지 색(초록색/노란색/회색) 중 하나로 표현되어야 한다.
- Results
- [x] 정답을 포함하고 있는 경우 true를 반환한다.
- [x] 정답을 포함하고 있지 않은 경우 false를 반환한다.
Empty file removed src/main/java/.gitkeep
Empty file.
19 changes: 19 additions & 0 deletions src/main/java/wordle/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package wordle;

import wordle.domain.DictionaryFileReader;
import wordle.domain.DictionaryReader;
import wordle.domain.EpochDayBaseWordSelector;
import wordle.domain.WordSelector;
import wordle.view.ConsoleInputView;
import wordle.view.ConsoleOutputView;

public class Application {
public static void main(String[] args) {
final ConsoleInputView inputView = new ConsoleInputView();
final ConsoleOutputView outputView = new ConsoleOutputView();
final DictionaryReader dictionaryReader = new DictionaryFileReader();
final WordSelector wordSelector = new EpochDayBaseWordSelector();
final Game game = new Game(inputView, outputView, dictionaryReader, wordSelector);
game.start();
}
}
56 changes: 56 additions & 0 deletions src/main/java/wordle/Game.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package wordle;

import wordle.domain.*;
import wordle.view.InputView;
import wordle.view.OutputView;

public class Game {
private final InputView inputView;
private final OutputView outputView;
private final DictionaryReader dictionaryReader;
kwj1270 marked this conversation as resolved.
Show resolved Hide resolved
private final WordSelector wordSelector;

public Game(final InputView inputView,
final OutputView outputView,
final DictionaryReader dictionaryReader,
final WordSelector wordSelector) {
this.inputView = inputView;
this.outputView = outputView;
this.dictionaryReader = dictionaryReader;
this.wordSelector = wordSelector;
}

public void start() {
final Dictionary dictionary = dictionaryReader.read();
final Word word = dictionary.select(wordSelector);
final Answer answer = new Answer(word.word());
play(dictionary, answer);
}

private void play(final Dictionary dictionary, final Answer answer) {
Attempt attempt = new Attempt();
kwj1270 marked this conversation as resolved.
Show resolved Hide resolved
Results results = new Results();
outputView.welcome(attempt.last());
do {
final Guess guess = guess(dictionary);
final Result result = answer.examine(guess);
results = results.add(result);
attempt = attempt.next();
outputView.showResults(results, attempt);
} while (attempt.isRunning() && results.hasNotAnswer());
kwj1270 marked this conversation as resolved.
Show resolved Hide resolved
}

private Guess guess(final Dictionary dictionary) {
try {
outputView.insertWord();
final String word = inputView.inputWord();
if (dictionary.isExist(word)) {
return new Guess(word);
}
throw new IllegalArgumentException();
} catch (final Exception e) {
outputView.wrongWord();
return guess(dictionary);
}
}
}
23 changes: 23 additions & 0 deletions src/main/java/wordle/domain/Alphabet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package wordle.domain;

import java.util.Arrays;

public enum Alphabet {
kwj1270 marked this conversation as resolved.
Show resolved Hide resolved
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z,
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z;

public static Alphabet of(final int codePoint) {
return of(Character.toChars(codePoint));
}

public static Alphabet of(final char[] chars) {
return of(String.valueOf(chars));
}

public static Alphabet of(final String alphabet) {
return Arrays.stream(values())
.filter(it -> it.name().equals(alphabet))
.findFirst()
.orElseThrow(IllegalArgumentException::new);
}
}
Loading