반응형
2022-02-13 update
최고로 빠른 중복제거
private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
ArrayList<String> resultList = new ArrayList<String>();
for (String temp : input) {
if (!resultList.contains(temp)) {
resultList.add(temp);
}
}
return resultList;
}
중복을 제거하는 7가지 방법들
1. 로직을 이용한 중복 제거
import java.util.ArrayList;
private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
ArrayList<String> resultList = new ArrayList<String>();
for (String temp : input) {
if (!resultList.contains(temp)) {
resultList.add(temp);
}
}
return resultList;
}
2. HashSet을 이용한 중복제거
import java.util.ArrayList;
import java.util.HashSet;
private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
return new ArrayList<String>( new HashSet<String>(input));
}
3. TreeSet을 이용한 중복제거
import java.util.ArrayList;
import java.util.TreeSet;
private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
return new ArrayList<String>(new TreeSet<String>(input));
}
4. Google guava를 이용한 중복제거
import java.util.ArrayList;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
return Lists.newArrayList(Sets.newHashSet(input));
}
5. stream(Java 8 이상만 사용가능)을 이용한 중복제거
import java.util.ArrayList;
import java.util.stream.Collectors;
private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
return (ArrayList<String>) input
.parallelStream()
.distinct()
.collect(Collectors.toList());
}
6. LinkedHashSet 이용한 중복제거
import java.util.ArrayList;
import java.util.LinkedHashSet;
private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
return new ArrayList<String>(new LinkedHashSet<String>(input));
}
7. 로직을 이용한 중복제거2
import java.util.ArrayList;
private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
ArrayList<String> resultList = new ArrayList<String>(input);
for (int i = 0; i < resultList.size(); i++) {
for (int j = i+1; j < resultList.size(); j++) {
if (resultList.get(j).equals(resultList.get(i))) {
resultList.remove(i);
}
}
}
return resultList;
}
측정 방법
public class Main {
public static void main(String[] args) {
ArrayList<String> dataList = new ArrayList<String>();
ArrayList<String> resultList = new ArrayList<String>();
dataList.add("1111");
dataList.add("2222");
dataList.add("3333");
dataList.add("3333");
dataList.add("aaaa");
dataList.add("bbbb");
dataList.add("eeee");
dataList.add("bbbb");
dataList.add("안녕");
dataList.add("안녕?");
dataList.add("안녕");
dataList.add("이건 코드가 아니다");
int x = 0;
while (x < 10000) {
long starttime = System.nanoTime();
/*시작점 시간 저장*/
/*----------중복제거------*/
resultList = rmDupliArrayList(dataList);
/*----------중복제거------*/
long endtime = System.nanoTime();
/*모든 코드가 실행되고 시간 저장*/
long estimatedTime = endtime - starttime;
/*시작점과 끝점을 계산하여 걸린 시간 측정*/
System.out.println(estimatedTime);
/*걸린시간을 출력*/
++x;
}
System.out.println(resultList);
/*중복제거가 잘 되었는지 확인*/
}
10000번 루프문으로 실행 결과를 모아서 평균을 낸다.
측정결과
결론
중복제거에만 한정하여 로직문이 제일 좋다.
(몇몇 방법의 경우 자동 정렬까지 되므로 더 효율적일수 있다. 실험 필요)
추가
5년전 2017
2022
난 이 실험을 대략 5년전에도 했는데, 순위는 변한게 없지만, 컴퓨터의 기본 속도 자체가 엄청나게 달라졌다는걸 확 체감할수 있었다.
심지어, 5년전에 한 실험은 천번을 반복했고. 이번엔 만번을 반복시켰는데도 말이다.
반응형
'old > Programming' 카테고리의 다른 글
[java]String to int, int to String 형변환 casting variables (0) | 2017.08.18 |
---|---|
홍미노트Redmi note 4에 리니지OS (Lineage OS) 인스톨 하는 법 (2) | 2017.08.01 |
[자바]String에서 모든 공백제거 (0) | 2017.03.18 |
자바 프로그램 수행 시간 측정 하는 법 (성능 평가) (0) | 2017.03.17 |
새 하드 장착법: 윈도우7 이상 (0) | 2017.01.07 |