ArrayList <String>не устанавливает минимальную емкость - PullRequest
0 голосов
/ 14 июля 2011
private static ArrayList<String> places(ArrayList<Road> roads) {
    ArrayList<String> places = new ArrayList<String>(10); // tried setting minimum capacity
    places.ensureCapacity(10); // tried setting minimum capacity

    for (int i = 0; i < roads.size(); i++) {
        String from = roads.get(i).getFrom();
        String to = roads.get(i).getTo();

        for (int j = 0; j < places.size(); j++) { // this is where things go wrong, it doesn't iterate because the "j < places.size()" condition isn't met
            if ((places.get(i).equals(from))==false) {
                places.add(from);
            }
            if ((places.get(i).equals(to))==false) {
                places.add(to);
            }
        }
    }

    return places;
}

Не знаю, почему, но мест-ArrayList не устанавливает начальную емкость, что приводит к невозможности итерации мест, когда мне придется позже (цикл for, который имеет дело с переменной j).

Ответы [ 4 ]

4 голосов
/ 14 июля 2011

Минимальная вместимость отличается от размера.Установка емкости - это всего лишь подсказка списку, что у него должно быть как минимум столько памяти, чтобы избежать ненужных копий массива, но это не влияет на размер, поэтому, даже если у вас есть емкость для n элементов, size() может быть меньше, ивызов get(n-1) может привести к IndexOutOfBoundsException.

. Чтобы создать список размера n, заполненный null, попробуйте

List<String> myList = new ArrayList<String>(n);
for (int i = 0; i < n; ++i) { myList.add(null); }
2 голосов
/ 14 июля 2011

Атрибут емкости просто дает классу величину измерения его внутреннего буфера.Он не добавляет никаких значений в список (кстати, какие значения были бы добавлены?), Так что список все еще пуст.связанный штраф производительности) позже в исполнении.Но это не жесткий предел.Вы можете добавить или больше элементов по желанию, как и в любом другом списке.

0 голосов
/ 14 июля 2011

ArrayList.ensureCapacity() выделяет достаточно памяти для хранения до заданного количества записей. Это на самом деле ничего не помещает в ArrayList.

ArrayList.size() считает количество фактических записей, а не текущую емкость.

Ваш цикл просматривает places.size() перед тем, как вы вызовете places.add(), чтобы фактически поместить что-либо в places. Когда places.size() вызывается в начале цикла, он корректно возвращает 0, потому что на данный момент вы еще ничего не поместили в places.

Еще один момент. У вас есть метод с именем places, и внутри этого метода локальная переменная также называется places. Это рецепт путаницы. Вы должны использовать другое имя для одного из них.

0 голосов
/ 14 июля 2011

Использование foreach:

for(Road road : roads)
{
    String from = road.getFrom();
    String to = roads.getTo();
    for(Places place: places)
    {
        if(!place.equals(from)) places.add(from);
        if(!place.equals(to))   places.add(to);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...