'where'로 필터링하기
Coddy Dart 여정의 로직 & 흐름 섹션에 포함된 레슨. 65개 중 11번째.
map()이 리스트의 모든 요소를 변환하는 반면, 때로는 특정 기준을 충족하는 요소만 유지하고 싶을 때가 있습니다. where() 메서드를 사용하면 각 요소를 조건에 따라 테스트하고 테스트를 통과한 요소만 유지함으로써 리스트를 필터링할 수 있습니다.
where() 메서드는 각 요소에 대해 true 또는 false를 반환하는 테스트 함수를 인자로 받습니다. true를 반환하는 요소는 결과에 포함되고, false를 반환하는 요소는 필터링되어 제외됩니다.
List<int> scores = [45, 78, 92, 33, 67, 88];
// 50점 이상의 점수만 유지하도록 필터링
var passingScores = scores.where((score) => score > 50);
print(passingScores); // (78, 92, 67, 88)이 필터링 방식은 리스트를 수동으로 순회하며 새로운 컬렉션을 구축하는 것보다 훨씬 깔끔합니다. where() 메서드는 데이터 처리의 근본적인 패턴을 나타내며, 추출하는 방법보다는 유지하고 싶은 항목을 선언적으로 지정할 수 있게 해줍니다.
챌린지
쉬움테스트 점수를 기준으로 학생들을 필터링하여 학생 성적 추적 시스템을 관리하는 프로그램을 작성하세요. 프로그램의 요구 사항은 다음과 같습니다:
- 클래스 이름을 나타내는 문자열 입력을 읽습니다.
- 학생들의 테스트 점수를 나타내는 여러 개의 정수 입력을 읽습니다 (입력은
-1을 받으면 종료됩니다). - 최소 합격 점수 임계값을 나타내는 정수 입력을 읽습니다.
where()메서드를 사용하여 임계값보다 크거나 같은 점수만 필터링하여 유지합니다.- 아래에 표시된 정확한 형식으로 필터링 결과를 출력합니다.
예를 들어, 클래스 이름이 "Mathematics 101"이고, 점수가 85, 42, 78, 91, 55, 88이며, 임계값이 70인 경우 프로그램은 다음과 같이 출력해야 합니다:
Class: Mathematics 101
Original scores: [85, 42, 78, 91, 55, 88]
Minimum passing score: 70
Filtering scores >= 70
Passing scores: (85, 78, 91, 88)
Students passed: 4 out of 6
Pass rate: 66.67%클래스 이름이 "Science Lab"이고, 점수가 45, 38, 52이며, 임계값이 60인 경우 프로그램은 다음과 같이 출력해야 합니다:
Class: Science Lab
Original scores: [45, 38, 52]
Minimum passing score: 60
Filtering scores >= 60
Passing scores: ()
Students passed: 0 out of 3
Pass rate: 0.00%클래스 이름이 "History"이고, 점수가 95, 88, 92이며, 임계값이 80인 경우 프로그램은 다음과 같이 출력해야 합니다:
Class: History
Original scores: [95, 88, 92]
Minimum passing score: 80
Filtering scores >= 80
Passing scores: (95, 88, 92)
Students passed: 3 out of 3
Pass rate: 100.00%프로그램은 반드시 where() 메서드를 사용하여 임계값보다 크거나 같은 점수를 필터링해야 합니다. 필터링된 결과는 iterable로서 괄호 형식으로 표시됩니다. 합격률은 (합격 학생 수 / 전체 학생 수) * 100 공식을 사용하여 소수점 둘째 자리까지 백분율로 계산하십시오.
직접 해보기
import 'dart:io';
void main() {
// 클래스 이름 읽기
String? className = stdin.readLineSync();
// -1이 입력될 때까지 점수 읽기
List<int> scores = [];
while (true) {
int score = int.parse(stdin.readLineSync()!);
if (score == -1) break;
scores.add(score);
}
// 최소 합격 점수 기준 읽기
int threshold = int.parse(stdin.readLineSync()!);
// TODO: 아래에 코드를 작성하세요
// where() 메서드를 사용하여 threshold 이상의 점수를 필터링하세요
// 요구된 형식으로 결과 출력
print('Class: $className');
print('Original scores: $scores');
print('Minimum passing score: $threshold');
print('Filtering scores >= $threshold');
// 합격 점수, 합격한 학생 수, 합격률 출력
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
1고급 리스트 조작
리스트 속성: first 및 last리스트 상태: isEmpty 및 isNotEmpty리스트 뒤집기리스트에 추가: insert리스트 요소 제거: removeWhere리스트에서 찾기: indexOf리스트 정렬리스트 섞기요약 - 리스트 정리 도구2함수형 리스트 연산
'map'으로 변환하기'where'로 필터링하기'.toList()' 사용하기'any'로 조건 확인하기'every'로 조건 확인하기'firstWhere'로 찾기요약 - 데이터 필터링직접 연습해 보세요: 온라인 Dart 컴파일러