2012-03-31 2 views
0

Я пытаюсь найти число уникальных символов в String. Решение должно быть таким же эффективным (сложность по времени O (N), очень большие массивы, в целом Big O), насколько это возможно. Я решил сделать это таким образом (если у вас есть лучшее решение, пожалуйста, дайте мне знать). Единственная проблема заключается в том, что когда я пытаюсь запустить ее, она всегда говорит, что существует только одно отдельное значение. Кажется, что существует проблема с методом Collections.addAll (возможно, я использую его неправильно). Пожалуйста, дайте мне знать, как это исправить. Кажется, что он принимает только первый символ в массиве. Спасибо.Коллекции addAll метод для набора уникальных значений

String ds = "acvdgefav"; 
    char[] sa = ds.toCharArray(); 

    for (int i=0; i<sa.length; i++) 
     System.out.println(sa[i]); 
    System.out.println(); 
    System.out.println(sa.length); 
    System.out.println(); 

    HashSet hs = new HashSet(); 
    Collections.addAll(hs, sa); 
    for (int i=0; i<hs.size(); i++) 
     System.out.println(sa[i]); 
    System.out.println(); 
    int z = hs.size(); 
    System.out.println(z); 

ответ

4

Я предлагаю вам использовать дженерики, так как это приведет к ошибке в вашем коде, так же как и отладчик, чтобы выполнить свой код.

Наиболее эффективным подходом было бы использование BitSet. Вероятно, это будет в 10 раз быстрее, чем использование HashSet, но будет иметь одинаковую сложность.

+0

Просьба уточнить, как использовать BitSet с этим кодом. Я попробовал generics, но методы addAll отклонили, когда я попытался поместить в него HashSet . – aretai

+1

'for (int i = 0; i

0

Я думаю, используя Collections.addAll подобное будет просто добавить сам массив в набор, а не ее героев. См. Также this.

import java.util.*; 
class a{ 
    static <T> void f(T...a){ 
     System.out.println(a.getClass().getCanonicalName()); 
     System.out.println(a.length); 
     System.out.println(a[0].getClass().getCanonicalName()); 
     System.out.println(); 
    } 
    public static void main(String[]args){ 
     f(1,2,3); 
     f(new int[]{1,2,3}); 
     f(new Integer[]{1,2,3}); 
    } 
} 

Выход:

java.lang.Integer[] 
3 
java.lang.Integer 

int[][] 
1 
int[] 

java.lang.Integer[] 
3 
java.lang.Integer 

В основном метод переменной аргументы, принимая общий массив будет в конечном итоге с Object..., реализованного как Object[], который не совместим с int[], поэтому int[] получает коробку ,

Кроме того, это:

for (int i=0; i<hs.size(); i++) 
    System.out.println(sa[i]); 

неправильно. Нет никакой связи между i и символами в sa.

+0

Хорошо, что я пытался сделать, это использовать спецификацию набора (без дубликатов элементов) и просто добавить все элементы из массива в набор (дубликаты не будут добавлены), поэтому вкратце будут только отдельные значения. Затем используйте size(), и я получил его. Вы правы в строке (copy-paste eh) Iterator i = hs.iterator(); while (i.hasNext()) System.out.println (i.next()); но затем он возвращает какое-то нерелевантное значение. Я проверил оба Collections.addAll() и Arrays.asList() только думал, что этот способ будет более эффективным – aretai

+0

Я ошибался в отношении 'Arrays.asList', я думаю, что то же самое происходит. – Vlad

+0

, тогда мне нужно будет понизить вас;) – aretai