Лучший способ получить значение от Набора индексом

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

Если на этот столбец ссылаются другие таблицы, вам необходимо выяснить, что делать с другими таблицами / столбцами. Одним из вариантов является удаление внешних ключей и сохранение ссылочных данных в других таблицах.

Другой вариант - найти все ссылающиеся столбцы и удалить их, если они больше не нужны.

В таких случаях реальной проблемой является поиск всех внешних ключей. Вы можете сделать это, запросив системные таблицы или используя сторонние инструменты, такие как ApexSQL Search (бесплатно) или Red Gate Tracker Dependency (премиум, но больше функций). Там целая ветка по внешним ключам здесь

42
задан Paul Rooney 24 April 2018 в 04:54
поделиться

7 ответов

Я согласен, что это вообще плохая идея. Однако в Commons Collections есть хорошая процедура для получения значения по индексу, если вам действительно нужно:

CollectionUtils.get (collection, index)

10
ответ дан 26 November 2019 в 23:28
поделиться

Не надо. Коллекция избегает упоминания индексов конкретно, потому что это может не иметь смысла для конкретной коллекции. Например, список подразумевает некоторую форму упорядочения, а Set - нет.

Collection<String> myCollection = new HashSet<String>();
myCollection.add("Hello");
myCollection.add("World");

for (String elem : myCollection) {
    System.out.println("elem = " + elem);
}

System.out.println("myCollection.toArray()[0] = " + myCollection.toArray()[0]);

дает мне:

elem = World
elem = Hello
myCollection.toArray()[0] = World

, в то время как:

myCollection = new ArrayList<String>();
myCollection.add("Hello");
myCollection.add("World");

for (String elem : myCollection) {
    System.out.println("elem = " + elem);
}

System.out.println("myCollection.toArray()[0] = " + myCollection.toArray()[0]);

дает мне:

elem = Hello
elem = World
myCollection.toArray()[0] = Hello

Почему ты хочешь это сделать? Не могли бы вы просто перебрать коллекцию?

54
ответ дан 26 November 2019 в 23:28
поделиться

В общем, хорошего способа не существует, так как Collection s не гарантированно имеют фиксированные индексы. Да, вы можете перебирать их, как работает toArray (и другие функции). Но порядок итераций не обязательно фиксирован, и если вы пытаетесь индексировать в общую коллекцию, вы, вероятно, делаете что-то не так. Было бы разумнее проиндексировать в Список .

18
ответ дан 26 November 2019 в 23:28
поделиться

Я согласен с ответом Мэтью Флашена и просто хотел показать примеры вариантов для случая, когда вы не можете переключиться в список (потому что библиотека возвращает вам коллекцию):

List list = new ArrayList(theCollection);
list.get(5);

или

Object[] list2 = theCollection.toArray();
doSomethingWith(list[2]);

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

Изменить: Другой вопрос, каковы намерения и семантика исходная коллекция.

17
ответ дан 26 November 2019 в 23:28
поделиться

Вы должны либо заключить вашу коллекцию в список ( new ArrayList (c) ), либо использовать c.toArray () , поскольку Коллекции не имеют понятия «индекса» или «порядка».

5
ответ дан 26 November 2019 в 23:28
поделиться

Преобразуйте коллекцию в массив с помощью функции

Object[] toArray(Object[] a) 
2
ответ дан 26 November 2019 в 23:28
поделиться

you definitively want a List:

The List interface provides four methods for positional (indexed) access to list elements. Lists (like Java arrays) are zero based.

Also

Note that these operations may execute in time proportional to the index value for some implementations (the LinkedList class, for example). Thus, iterating over the elements in a > list is typically preferable to indexing through it if the caller does not know the implementation.

If you need the index in order to modify your collection you should note that List provides a special ListIterator that allow you to get the index:

List<String> names = Arrays.asList("Davide", "Francesco", "Angelocola");
ListIterator<String> i = names.listIterator();

while (i.hasNext()) {
    System.out.format("[%d] %s\n", i.nextIndex(), i.next());
}
1
ответ дан 26 November 2019 в 23:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: