2009-12-08 35 views
5

Trong Java, làm cách nào để chuyển đổi một chuỗi các chuỗi thành một mảng các giá trị duy nhất?Làm cách nào để chuyển đổi một chuỗi các chuỗi thành một mảng các giá trị duy nhất?

Nếu tôi có mảng này của Strings:

String[] test = {"1","1","1","2"} 

Và tôi muốn kết thúc với:

String[] uq = {"1","2"} 
+0

Sử dụng sửa đổi Mergesort, xóa các từ khóa trùng lặp hen gặp phải, thay vì thêm cả hai bản sao vào danh sách. Chạy trong ** 'O (N * logN)' ** –

Trả lời

2

Nếu bạn đang đi với HashSet -approach (có vẻ khá tiện dụng), bạn nên sử dụng LinkedHashSet thay vì HashSet nếu bạn muốn duy trì thứ tự của mảng!

Set<String> temp = new LinkedHashSet<String>(Arrays.asList(array)); 
String[] result = temp.toArray(new String[temp.size()]); 
1

Một cách dễ dàng là để tạo ra một bộ, thêm mỗi phần tử trong mảng đến nó, và sau đó chuyển đổi tập hợp thành một mảng.

1
List list = Arrays.asList(test); 
Set set = new HashSet(list); 

String[] uq = set.toArray(); 
+0

Nó sẽ dễ dàng hơn để gọi 'Set.toArray()'. –

+0

Vâng trong một khoảnh khắc tôi chọn cách loooong dunno tại sao –

13

cách nhanh nhưng hơi kém hiệu quả sẽ là:

Set<String> temp = new HashSet<String>(Arrays.asList(test)); 
String[] uq = temp.toArray(new String[temp.size()]); 
+0

Tại sao nó không hiệu quả? Xem xét mảng có thể có nhiều hơn bốn giá trị. Cách khác là sắp xếp mảng và tìm kiếm hai lần, đúng không? –

2
String[] test = {"1","1","1","2"}; 
java.util.Set result = new java.util.HashSet(java.util.Arrays.asList(test)); 
System.out.println(result); 
+0

Phần "" + không bắt buộc, System.out.println (kết quả) là tất cả những gì cần thiết. – daveb

+0

Phải, đã vội vàng :) – maximdim

2

Một thay thế cho phương pháp HashSet sẽ được:

  1. Sắp xếp các mảng đầu vào

  2. Đếm số o f giá trị không trùng lặp trong mảng được sắp xếp

  3. Phân bổ mảng đầu ra

  4. lặp qua mảng được sắp xếp, sao chép các giá trị không trùng lặp với nó.

Cách tiếp cận HashSet là O(N) bình quân giả định rằng 1) bạn preallocate HashSet với kích thước phù hợp và 2) (không trùng lặp) giá trị trong mảng băm đầu vào khá đồng đều. (Nhưng nếu giá trị băm là bệnh lý, trường hợp xấu nhất là O(N**2)!)

Phương pháp sắp xếp là trung bình O(NlogN).

Phương pháp tiếp cận HashSet chiếm nhiều bộ nhớ hơn.

Nếu bạn đang làm điều này thường xuyên HOẶC cho "cư xử rất tốt" mảng đầu vào thực sự lớn, cách tiếp cận HashSet có lẽ tốt hơn. Nếu không, nó có thể là một toss-up mà cách tiếp cận là tốt hơn.

2

Tôi đã thử tất cả các câu trả lời trên trang này và không có câu trả lời nào có hiệu quả.Vì vậy, đây là cách tôi giải quyết nó, lấy cảm hứng từ câu trả lời từ Taigakuhn:

import groovy.io.*; 
def arr = ["5", "5", "7", "6", "7", "8", "0"] 
List<String> uniqueList = new ArrayList<String>( 
     new LinkedHashSet<String>(arr.asList()).sort()); 
System.out.println(uniqueList) 
0

đây là giải pháp của tôi:

int[] A = {2, 1, 2, 0, 1}; 

Arrays.sort(A); 

ArrayList<Integer> B = new ArrayList<Integer>(); 

for (int i = 0; i < A.length; i++) { 
if (i == A.length-1) { 
    B.add(A[i]); 
} 
else if (A[i] != A[i+1]) { 
    B.add(A[i]); 
} 
} 
0
String[] getDistinctElementsArray(String[] arr){ 

    StringBuilder distStrings = new StringBuilder(); 
    distStrings.append(arr[0] + " "); 
    for(int i=1;i<arr.length;i++){ 
     if(arr[i].equals(arr[i-1])){} 
     else{ 
      distStrings.append(arr[i] + " "); 
     } 
    } 
    return distStrings.toString().split(" "); 
} 
0

Chỉ cần tìm ra một cách đẹp hơn trong Java 8:

Arrays.stream(aList).distinct().toArray(String[]::new) 
Các vấn đề liên quan