Java ArrayList ищет несколько строк - PullRequest
0 голосов
/ 22 августа 2010

Допустим, у меня есть две одинаковые строки внутри ArrayList ... есть ли способ проверить это?Также есть ли способ проверить, сколько раз строка с одинаковым значением находится в ArrayList?

Итак, допустим, у меня есть следующая строка ArrayString.

os.println(itemIDdropped + "|" + spawnX + "|" + spawnY + "|" + currentMap + "|drop|" + me.getUsername());
1. 1|3|5|1|drop|Dan
2. 2|5|7|2|drop|Luke
3. 1|3|5|2|drop|Dan
4. 3|3|5|1|drop|Sally

Вот чтоцифры / буквы означают для 1-4 строк ... идентификатор элемента, X pos, Y pos, Map on on, команда drop, пользователь, который его отбросил

Тогда, скажем, я разделил это, выполнив это:

String[] itemGrnd = serverItems.get(i).split("\\|");

Теперь, скажем, у меня есть цикл for, подобный этому:

for (int i = 0; x < serverItems.size(); i++) {
    System.out.println(serverItems.get(i));
}

Я хочу найти где X, Y и Map или в этом случае itemGrnd [1], itemGrnd [2] и itemGrnd [3] совпадают с ЛЮБОЙ другой строкой в ​​ArrayList, которую я нашел с помощью serverItems.get (i).

И если МЫ НАШЕМ НАХОДИМ ... (который вПриведенный выше пример ... x, y и map одинаковы для 1 и 4 ... затем создайте IF, чтобы сделать это ОДНАЖДЫ ... потому что я не хочу этого делать: (Кстати, я делаюследите за моими переменными на стороне клиента, так что не беспокойтесь об этом. Да, я знаю, что они называются spawnX и spawnY ... это просто текущий X, Y.

if (spawnX.equals(Integer.parseInt(itemGrnd[1])) && 
    spawnY.equals(Integer.parseInt(itemGrnd[2])) &&
    currentMap.equals(Integer.parseInt(itemGrnd[3]))) {
}

Теперь, если мыЧтобы сделать это .... 1 и 4 были обработаны здесь.Я хочу сделать это ТОЛЬКО ОДНАЖДЫ .. ВСЕГДА, если мы найдем несколько строк (например, 1 и 4)

Спасибо

Ответы [ 3 ]

1 голос
/ 22 августа 2010

Ну, довольно просто узнать, сколько String ArrayList имеет:

public class ArrayListExample {
    private static final String TO_FIND = "cdt";

    public static void main(String[] args) {
        ArrayList<String> al = new ArrayList<String>();
        al.add("abc");
        al.add("dde");
        //4 times
        al.add(TO_FIND);
        al.add(TO_FIND);
        al.add(TO_FIND);
        al.add(TO_FIND);

        ArrayList<String> al1 = (ArrayList<String>) al.clone();
        int count = 0;
        while (al1.contains(TO_FIND)) {
            al1.remove(TO_FIND);
            count++;
        }
        System.out.println(count);
    }
}
0 голосов
/ 22 августа 2010

Если вы хотите такое поведение, вы можете проверить проект Apache Commons / Collections , который расширяет коллекции java по умолчанию с помощью некоторых полезных интерфейсов, включая интерфейс bag ( JavaDoc ), что, кажется, то, что вы ищете: коллекция, которая знает, сколько элементов одного вида она содержит.Недостаток: поддержка дженериков пока отсутствует, поэтому вы работаете с необработанными коллекциями.

или Google Guava , более современная библиотека с похожей концепцией, называемая MultiSet , который, вероятно, более удобный для пользователя.У Guava, однако, еще нет версии выпуска, хотя она уже широко используется в производстве.

О, и есть также стандартная функция JavaSE: Collections.frequency (Collection, Object) , хотяон предположительно работает плохо.

0 голосов
/ 22 августа 2010

Более быстрый способ - отсортировать ArrayList и посмотреть, сколько там разных элементов.Решение Denis_k - это O (n ^ 2), а при сортировке - O (nlog (n)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...