Коллекции метод addAll для набора уникальных значений - PullRequest
0 голосов
/ 31 марта 2012

Я пытаюсь найти количество уникальных символов в строке. Решение должно быть максимально эффективным (временная сложность O (N); очень большие массивы; в общем случае Big O), насколько это возможно. Я решил сделать это таким образом (если у вас есть лучшее решение, пожалуйста, дайте мне знать). Единственная проблема заключается в том, что когда я пытаюсь запустить его, он всегда говорит, что есть только одно отдельное значение. Кажется, есть проблема с методом Collections.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);

Ответы [ 2 ]

4 голосов
/ 31 марта 2012

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

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

0 голосов
/ 31 марта 2012

Я думаю, что использование 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.

...