06. sort
22462 ワード
📌 6-1 sortは?
✔配列.sort(コールバック関数(比較(a,b))
✔Unicode順に昇順で戻る.
✔コールバック関数内にaとbを作成し、aとbをunionコードに変換して比較し、返します.
✔円がきちんと並んでいます.新しい配列コピーとして返されません.
📌 6-2 sort操作例
コールバック関数を渡さない場合は、Unicode順に昇順に並べ替えます.
const arr = ['A','D','B','C','Z','F'];
arr.sort(); // 유니코드 순으로 오름차순 정렬 시작
console.log(arr); // [ 'A', 'B', 'C', 'D', 'F', 'Z' ] 출력
コールバック関数を渡さないと、数値型に問題が発生します.const arr = [11, 7, 3, 19, 24];
arr.sort(); // 유니코드 순으로 오름파순 정렬 시작
console.log(arr); // [ 11, 19, 24, 3, 7 ] 출력
最初の位置を先に比較するので、1 1 1 2 3 7の順に並べ替えます.しかし3は最小の数字であり,コールバック関数を加えることで問題を解決できる.
📌 6-3 sortコールバック関数の使用
const arr = [11, 7, 3, 19, 24];
arr.sort((a,b) => a-b); // 숫자 오름차순 정렬
console.log(arr); // [ 3, 7, 11, 19, 24 ] 출력
Mdnを参照してコールバック関数の使用方法を記述した.コールバック関数をcompareと呼んで表現します.
const arr = [11, 7, 3, 19, 24];
arr.sort((a,b) => b-a); // 숫자 내림차순 정렬
console.log(arr); // [ 24, 19, 11, 7, 3 ]
ランダムにゼロを返して、配列が変化しているかどうかを見てみましょう.const arr = [11, 7, 3, 19, 24];
arr.sort((a,b) => 0); // 0을 반환
console.log(arr); // [ 11, 7, 3, 19, 24 ] 출력
このように0を返すと、円配列が返されます.📌 6-4 2つ以上の条件のソート
年齢順に昇順に並べ、年齢が同じ場合はアルファベット順に並べたコード.
const arr = [
{ firstName: 'Park', lastName: 'Sara', age: 18 },
{ firstName: 'Lee', lastName: 'Sin', age: 21 },
{ firstName: 'Kim', lastName: 'Song', age: 24 },
{ firstName: 'Son', lastName: 'San', age: 21 }
];
arr.sort((a, b) => {
// 0일경우 나이가 같음
if(a.age - b.age === 0) {
// 문자열 사전순으로 반환
return a.firstName.localeCompare(b);
} return a.age - b.age;
});
console.log(arr);
💡 Str1.localeCompare(Str 2)辞書順にStr 1が先にある場合、負の値は戻り、正の値が同じであれば0を返します.これだけの条件があっても、ソートできます.
📌 6-5ソートの選択
sortを用いたソートは便利であるが,いくつかのソートアルゴリズムがコードで実現できる開発者になりたいと考え,ソートを学習した.最も基本的な選択ソートアルゴリズムについて説明します.
function selectionSort(arr) {
// 2중 포문으로 배열탐색 시작
for (let i = 0; i < arr.length - 1; i++) {
let index = i;
for (let j = i + 1; j < arr.length; j++) {
// 탐색 하던 구간중 제일 큰 값을 index에 대입
if(arr[j] < arr[index]) index = j;
}
// 진행중인 배열과 배열뒤의 숫자를 바꿔준다.
const [acc, curr] = [arr[i], arr[index]];
arr[index] = acc;
arr[i] = curr;
}
return arr;
}
console.log(selectionSort([5, 13, 11, 7, 23, 15])); // 오름차순 정렬
📌 6-6ソートの質問に答える
バックグラウンドソートの問題(1431:シリアル番号)
function solution(arr) {
let answer = '';
// 정렬시작
arr.sort((a, b) => {
// 문자열 길이가 작은순서대로 오름차순 정렬
if(a.length < b.length) {
return a.length - b.length;
}
// 문자열 길이가 같다면 예외처리
if(a.length === b.length) {
// 문자열 안에 있는 숫자들의 합이 작은순대로 오름차순 정렬
const A = a.replace(/[a-z]/gi, "0").split('').map((item) => +item).reduce((acc, curr) => acc + curr);
const B = b.replace(/[a-z]/gi, "0").split('').map((item) => +item).reduce((acc, curr) => acc + curr);
// 숫자도 같으면 사전순으로 정렬
if(A === B) {
return a.localeCompare(b);
}
return A - B;
}
});
// 정답 정제
for(let item of arr) {
answer += item + '\n';
}
return answer.trim();
}
Reference
この問題について(06. sort), 我々は、より多くの情報をここで見つけました https://velog.io/@yhj96/06.-sortテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol