다른 사람의 블로그에 기존 등수 매기기의 알고리즘은 [80,80,80,60,60,60] 배열로 등수 매기기를 할 때, [1,1,1,3,3,3] 으로 결과가 나오는데,
내가 원하는 것은 [1,1,1,2,2,2] 이다.
일단 우선 배열에 대한 순서는 미리 설정되어 있다고 가정한다.
그러면 아까 말한 [1,1,1,3,3,3] 을 중복 제거를 통해 [1, 3] 으로 만든다.
그 이유는 중복 제거된 배열 [1,3] 의 index + 1 을 하면
의미를 가진다. 이중 for문을 사용해서, 각 배열마다 등수를 부여한다.
const referCntArray = [3, 3, 1, 1, 1]
console.log(rankArrMaking(referCntArray))
function rankArrMaking(arr) {
const referCntArray = arr; // [3, 3, 1, 1, 1]
const rankArr = []; // [1, 1, 3, 3, 3]
const rankArrFinal = [];
referCntArray.forEach((number) => {
rankArr.push(rank(number, referCntArray));
});
const rankArrFilter = rankArr.filter((v, i) => rankArr.indexOf(v) === i); // 중복 제거 [1, 3]
// [1, 1, 3, 3, 3] -> [1, 1, 2, 2, 2]
rankArr.forEach((rankArrNumber) => {
rankArrFilter.forEach((rankArrFilterNumber, index) => {
if(rankArrNumber == rankArrFilterNumber){
rankArrFinal.push(index + 1)
}
})
});
return rankArrFinal
}
// 랭킹 메서드( [3, 3, 1, 1, 1] -> [1, 1, 3, 3, 3] )
function rank(value, arr) {
var rank = arr.indexOf(value);
if(rank > -1)
return rank+1;
return null;
}
public static List<Integer> rankAlgorithm(List<Integer> arr){
List<Integer> arrRank = new ArrayList<>();
List<Integer> arrRankFinal = new ArrayList<>();
for(Integer i = 0; i < arr.size(); i ++) {
arrRank.add(rank(arr.get(i), arr));
}
List<Integer> referRankFilter = arrRank.stream().distinct().collect(Collectors.toList()); // 중복 제거
for(Integer referRankNum : arrRank) { // 추천인 등록수 순위 생성(2), ex : [1, 1, 2, 2, 2]
for(Integer index= 0 ; index < referRankFilter.size() ; index++){
if(referRankNum == referRankFilter.get(index)){
arrRankFinal.add(index + 1);
}
}
}
return arrRankFinal;
}
private static Integer rank(Integer value, List<Integer> arr){
List<Integer> sortReverseArr = arr.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
Integer rank = sortReverseArr.indexOf(value);
if(rank > -1) { rank += 1; }
return rank;
}