Browse Source

add ArrayUtil.distict

Looly 6 years ago
parent
commit
5e4718c8ce

+ 1 - 0
CHANGELOG.md

@@ -9,6 +9,7 @@
 * 【core】        CollUtil增加filterNew等方法(原filter变更为filterNew,新增filter)
 * 【crypto】      Sign增加setParameter方法
 * 【extra】        Sftp得put方法增加进度支持(issue#518@Github)
+* 【core】        ArrayUtil增加distinct方法
 
 ### Bug修复
 

+ 22 - 0
hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java

@@ -6,7 +6,9 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Set;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.IterUtil;
@@ -3827,4 +3829,24 @@ public class ArrayUtil {
 	public static boolean isAllNotEmpty(Object... args) {
 		return false == hasEmpty(args);
 	}
+	
+	/**
+	 * 去重数组中的元素,去重后生成新的数组,原数组不变<br>
+	 * 此方法通过{@link LinkedHashSet} 去重
+	 * 
+	 * @param array 数组
+	 * @return 去重后的数组
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T[] distinct(T[] array) {
+		if(isEmpty(array)) {
+			return array;
+		}
+		
+		final Set<T> set = new LinkedHashSet<>(array.length, 1);
+		for (T t : array) {
+			set.add(t);
+		}
+		return toArray(set, (Class<T>)getComponentType(array));
+	}
 }

+ 7 - 0
hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java

@@ -225,4 +225,11 @@ public class ArrayUtilTest {
 		arrayType = ArrayUtil.getArrayType(String.class);
 		Assert.assertEquals(String[].class, arrayType);
 	}
+	
+	@Test
+	public void distinctTest() {
+		String[] array = {"aa", "bb", "cc", "dd", "bb", "dd"};
+		String[] distinct = ArrayUtil.distinct(array);
+		Assert.assertArrayEquals(new String[] {"aa", "bb", "cc", "dd"}, distinct);
+	}
 }