Подсчет количества раз в строке строки появляются в векторе, затем удаляя их, если счетчик ниже порога - PullRequest
3 голосов
/ 23 марта 2011

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

По некоторым причинам я просто не могу заставить его работать.Метод, который я создал для этого, показан ниже.

public static void correctDisturbance(Vector<String> names, Vector<Integer> lengths, int lengthGuard){

    int guard = lengths.size();

    int total = 0;

    for(int i = 0; i < guard; i++)
    {
        if(lengths.elementAt(i) <= lengthGuard)
        {
            int newTotal = total + lengths.elementAt(i);

            while(total < newTotal)
            {
                System.out.println("Removing: " + names.elementAt(newTotal));
                names.removeElementAt(newTotal);
                newTotal--;
            }
            lengths.removeElementAt(i);
            guard--;
        }
        else
        {
            total += lengths.elementAt(i);
        }
    }

Он удаляет некоторые из тех, которые мне нужны, но не другие.У меня установлено пороговое значение 5.

Пример содержимого вектора длин: [15, 15, 1, 15, 2, 1, 1, 2, 1, 3, 1, 2, 1, 5, 1, 4, 1, 1, 3]

Заранее благодарен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2011

Было очень мало проблем с вашим методом. Вот отлаженная версия:

public static void correctDisturbance(List<String> names,
        List<Integer> lengths, int lengthGuard) {
    int guard = lengths.size();
    int total = 0;
    for(int i = 0;i < guard;i++) {
        if (lengths.get(i) <= lengthGuard) {
            int newTotal = total + lengths.get(i);
            while( total < newTotal ) {
                newTotal--; // LINE MOVED
                System.out.println("Removing: " + names.get(newTotal));
                names.remove(newTotal);
            }
            lengths.remove(i);
            i--; // LINE ADDED
            guard--;
        } else {
            total += lengths.get(i);
        }
    }
}

Как видите, только два изменения были необходимы. Во-первых, newTotal нужно было уменьшить перед использованием, потому что массивы и списки Java основаны на нуле. Во-вторых, когда вы удалили элемент из списка lengths, вам также пришлось уменьшить значение i, чтобы не пропустить запись.

0 голосов
/ 23 марта 2011

Используйте хэш вместо вектора, чтобы сохранить счет.Ключом является строка, а значением является число.

И, между прочим, используйте ArrayList вместо Vector.

...