2012-04-28 96 views
13

Tôi đang tạo một chương trình dựa trên xử lý chuỗi trong Java mà tôi cần phải loại bỏ các chuỗi trùng lặp khỏi một mảng chuỗi. Trong chương trình này, kích thước của tất cả các chuỗi đều giống nhau.Xóa chuỗi trùng lặp trong mảng chuỗi

'mảng' là một mảng chuỗi chứa một số chuỗi trong đó hai chuỗi giống nhau. Vì vậy, bằng cách sử dụng mã dưới đây, chuỗi trùng lặp phải được xóa nhưng không bị xóa.

Làm cách nào để xóa các chuỗi trùng lặp?

Tôi đang sử dụng mã sau.

for(int s=0;s<array.length-1;s++) 
    { 
     for(int m=0;m<array.length;m++) 
     { 
       for(int n=0;n<array[m].length();n++) 
       { 
        if(array[s].charAt(n)==array[m].charAt(n)) 
        { 
         continue; 
        } 
        else 
       break; 
     } 
     if(n==array[m].length()) 
     { 
      ArrayUtils.removeElement(array, array[s]); 
     } 
    } 
+0

gì chính xác là sai với mã bạn đã có ngay bây giờ? – Andy

+3

Tại sao bạn không sử dụng cấu trúc phù hợp hơn để loại bỏ trùng lặp, chẳng hạn như một HashSet chẳng hạn, thay vì mảng? – assylias

+0

u plz có thể cho biết mã sử dụng hashset là gì? –

Trả lời

26

này sẽ làm việc

array = new HashSet<String>(Arrays.asList(array)).toArray(new String[0]); 

hoặc chỉ sử dụng một HashSet thay vì một mảng.

+1

@Garrett Hall Cách tiếp cận này có được tối ưu hóa không? –

+3

Tối ưu hóa cho những gì? –

+2

Đối với 1 triệu người dùng khởi động trong tương lai của mình –

1
Set<String> set = new HashSet<String>(); 
Collections.addAll(set, array); 

hoặc bắt đầu với

for(int s=0;s<array.length-1;s++) 
{ 
    for(int m=s + 1;m<array.length;m++) 
    { 

       if(array[s] != null && array[s].equals(array[m])) 
       { 
        // array = ArrayUtils.removeElement(array, array[s]); --m;?? 
        array[m] = null; // Mark for deletion later on 
       } 
    } 
} 
2

Trừ khi đây là [homework] Tôi sẽ sử dụng một Set

String[] array = 
Set<String> uniqueWords = new HashSet<String>(Arrays.asList(array)); 
0
  • Tại sao bạn không sử dụng String.equals() để so sánh thay vì lặp lại thông qua các nhân vật trong các chuỗi bằng tay?
  • Logic của bạn thực sự là sai lầm: cho array[s] == "12345"array[m] == "123" nó sẽ tuyên bố rằng họ đều bình đẳng
  • hơn nữa, trong vòng lặp bên trong của bạn for(int m=0;m<array.length;m++)m cũng sẽ trở thành bằng s tại một số điểm, vì vậy bạn sẽ so sánh một chuỗi với chính nó

Ghi chú này giả định rằng bạn cần triển khai logic loại bỏ bằng mã của riêng bạn, không được phép sử dụng thư viện lớp học. Nếu đây không phải là trường hợp, như những người khác lưu ý, bằng cách sử dụng một HashSet là cách tiếp cận đơn giản nhất.

0

Tại sao bạn không xóa vòng lặp bên trong nhất có lợi cho String.equals(String)?

Trong lần lặp đầu tiên, bạn đang so sánh mảng [0] với mảng [0] bằng nhau và nó sẽ bị xóa. Sau đó, bạn sẽ so sánh mảng ban đầu [1] với tất cả các phần tử khác trong mảng, và nếu chúng bằng nhau, bạn đang loại bỏ mảng [1] (không phải mảng khác).

Có một số vấn đề, nếu có một số chuỗi trùng lặp, bạn sẽ loại bỏ chuỗi đầu tiên, điều này sẽ làm giảm kích thước của mảng mà không giảm r vì vậy, một số Chuỗi trong mảng bị bỏ qua.

Tôi sẽ sử dụng cấu trúc dữ liệu buộc tính độc đáo, chẳng hạn như Tập hợp.

Điều gì sẽ xảy ra nếu bạn có 3 Chuỗi bằng nhau trong mảng của mình, tôi không chắc chắn điều gì sẽ xảy ra.

Tôi tin rằng bạn sẽ gặp phải một số ArrayIndexOutOfBoundsException giây.

0

Tôi nghĩ rằng nếu tình trạng ở cuối nên if (n == (array [m] .length() - 1))

Có nói rằng, bạn dường như đang cố gắng để thực hiện những gì Chuỗi phương thức .equals() làm trong vòng lặp bên trong nhất của bạn.

-2

nguyên Duplicate remove: đây là câu trả lời hoàn hảo /// Haris ///

public static void duplicateRemove(int[] arr) { 
    int temp = 0; 

    for (int i = 0; i < arr.length; i++) { 
     for (int j = 0; j < arr.length; j++) { 
      if (arr[i] < arr[j]) { 
       temp = arr[i]; 
       arr[i] = arr[j]; 
       arr[j] = temp; 
      } 
     } 
    } 

    int count; 
    for (int j = 0; j < arr.length;) { 
     count = 1; 
     for (int i = j + 1; i < arr.length; i++) { 
      if (arr[i] == arr[j]) { 
       count++; 
      } else 
       break; 

     } 
     System.out.println(arr[j] + " is : " + count); 
     j += count; 
    } 

} 
+1

Câu hỏi là xóa STRINGS trùng lặp không phải số nguyên –

0
 String[] arr = {"w10","w20","w10","w30","w20","w40","w50","w50"}; 
    List<String> arrList = new ArrayList<String>(); 
    int cnt= 0; 
     //List<String> arrList = Arrays.asList(arr); 
     List<String> lenList = new ArrayList<String>(); 
      for(int i=0;i<arr.length;i++){ 
     for(int j=i+1;j<arr.length;j++){ 
      if(arr[i].equals(arr[j])){ 
      cnt+=1; 
      }     
     } 
     if(cnt<1){ 
      arrList.add(arr[i]); 
     } 
      cnt=0; 
     } 

for(int k=0;k<arrList.size();k++){ 
      System.out.println("Array without Duplicates: "+arrList.get(k)); 
     } 
Các vấn đề liên quan