2015-06-11 3 views
0

У меня есть следующий код, где я хочу получить только те значения, которые являются дубликатами, но не смогли найти правильный результат. Я не знаю, где я ошибаюсь.Как найти повторяющуюся строку в строковом массиве

public class TestDummy { 
    public static void main(String args[]){ 
     String arr[] ={"lady", "bird", "is","bird","lady","cook"}; 
     int len = arr.length; 
     System.out.println("Size "+len); 
     for(int i=0 ; i<=len;i++){ 
      for(int j=1 ; j< len-1;j++){ 
      if(arr[i]==arr[j]){ 
       System.out.println("Duplicate "+arr[i]); 
      } 
     } 
      } 
    } 


} 
+1

Вы попробуйте добавить их в набор? , Он более эффективен, чем ваш текущий подход, который принимает значение O (n^2) ' – TheLostMind

+0

Я не хочу использовать set. Можете ли вы помочь мне узнать, где ошибка в коде? –

+0

Посмотрите на это http://stackoverflow.com/a/1937083/1737819.Из карты слов с их вхождением выберите те, которые имеют события> 1. :) – Willmore

ответ

3
String arr[] ={"lady", "bird", "is","bird","lady","cook"}; 
    Map<String, Integer> map = new HashMap<>(); 
    for(String str: arr) { 
     if(map.containsKey(str)) { 
      map.put(str, map.get(str)+1); 
     } else{ 
      map.put(str, 1); 
     } 
    } 
    for(String str: map.keySet()) { 
     if(map.get(str) > 1) { 
      System.out.println("Duplicate: "+ str+" count:"+map.get(str)); 
     } 
    } 

выход:

Duplicate: bird count:2 
Duplicate: lady count:2 
0

Firsty Строки можно сравнить с .equals() не ==

if(arr[i].equals(arr[j])) 
{ 
    System.out.println("Duplicate "+arr[i]); 
} 

И я бы порекомендовал вам использовать sets, как они не позволяют повторяющиеся значения вводятся в него, или список и проверьте, он уже существует с использованием метода .contains().

List<String> list = new ArrayList(); 

for(int i = 0; i < arr.length; i++) 
    if(list.contains(arr[i]) 
    System.out.println("Duplicate" + arr[i]); 
    else 
    list.add(arr[i]); 
0

вы можете использовать более простой подход, как в следующем

Set<String> strings=new Hashset<String>(); 
for(int i=0;i<len;i++){ 
    if(strings.add(arr[i])==false){ 
     System.out.println(arr[i]+" is a duplicate"); 
    } 
} 

и в существующем коде сделать это как arr[i].equals(arr[j]), чтобы увидеть, если значения равны (если они равны они дубликат)

== проверяет ссылочную эквивалентность, тогда как метод equals() проверяет эквивалентность значений, поэтому вы должны использовать метод equals, когда вам нужно проверить эквивалентность двух объектов.

надеюсь, что это поможет!

Удачи вам!

0

Есть несколько вопросов.

for(int i=0 ; i<len;i++){ 
     for(int j=i +1 ; j< len;j++){ 
     if(arr[i].equals(arr[j])){ 
      System.out.println("Duplicate "+arr[i]); 
     } 
    } 
     } 

Обратите внимание, что: у меня есть изменение j=1 к j=i и == к .equals и <= к < и len -1 к len

1

Вы должны изменить свой код:

public static void main(String args[]) { 
     String arr[] = { "lady", "bird", "is", "bird", "lady", "cook" }; 
     int len = arr.length; 
     System.out.println("Size " + len); 
     for (int i = 0; i < len; i++) { // not <= but only < 
      for (int j = i + 1; j < len; j++) { // start from i+1 and go upto last element 
       if (arr[i].equals(arr[j])) { // use equals() 
        System.out.println("Duplicate " + arr[i]); 
       } 
      } 
     } 
    } 

O/P :

Size 6 
Duplicate lady 
Duplicate bird 
+0

Могу ли я получить числовое число? –

+0

@Littlebird - для этого вам нужно будет использовать карту/массив для подсчета – TheLostMind

0

Это дает вам список с дубликатами и их количество:

var duplicates = 
from word in arr 
group word by word into g 
where g.Count() > 1 
select new { g.Key, Count = g.Count() };  
0

создать карту ваших слов и occurencies.

import java.util.*; 

public class TestDummy { 
    public static void main(String args[]) { 
     String arr[] = { 
      "lady", "bird", "is", "bird", "lady", "cook" 
     }; 
     Map<String, Integer> dictionary = new TreeMap<>(); 

     int len = arr.length; 
     System.out.println("Size " + len); 
     for (int i = 0; i < len; i++) { 
      if (dictionary.containsKey(arr[i])) { 
       dictionary.put(arr[i], dictionary.get(arr[i]) + 1); 
       System.out.format("Duplicate %s%n", arr[i]); 
      } else { 
       dictionary.put(arr[i], 1); 
      } 
     } 
    } 
} 



**Output** 
    Size 6 
    Duplicate bird 
    Duplicate lady 
0
public static String[] removeDuplicates(String[] array){           
    return new HashSet<String>(Arrays.asList(array)).toArray(new String[0]);  
}                     
0

выше решения делает работу
, но только, чтобы сделать код чистый, вы можете использовать Linq.js

Смежные вопросы