Вопрос по generics, set, java – Лучший способ разыграть Iterator к набору , например
6

КастингIterator<Object> кSet<String>

Что было бы самым чистым / наилучшим способом?

Я не понимаю редактирование, это не вопрос обобщения. Даже если вы не используете обобщенные элементы, преобразование должно выполняться одинаково, обобщенные значения используются в примере для помощи аудитории, но если вы удалите все теги, проблема / вопрос останется там. Whimusical
Я положил редактирование, которое делает все это легко понять Whimusical
Вы правы, извините, теперь вопрос проще, я привел в пример без двусмысленности. Я имел в виду, что это не только обобщенная вещь, но и приведение внутренних типов, потому что мой итератор напечатан на & lt; A & gt; не & lt; B расширяет A & gt; и я должен вернуть конвертированную коллекцию внизу. Хорошо, просто забудьте об этом и примите новую правку как правильный вопрос. Whimusical
Извините, я постараюсь объяснить лучше. Удалите шаблоны / типы и постарайтесь сделать так, чтобы они компилировались без аннотаций и предупреждений. Я знаю, что могу циклически повторять и копировать каждое значение, но я ищу потенциальное скрытое классное решение. Whimusical
Я подумал, что это будет хорошим решением, я посмотрел API, но я ожидал, что, возможно, каким-то образом в строке без итерации, дженерики плюс приведение могут хорошо работать Whimusical

Ваш Ответ

6   ответов
1

org.apache.commons.collections.IteratorUtils может быть использован для этого.

Вот пример для преобразования итератора в set;

Set<String> mySet = new HashSet<String>(IteratorUtils.toList(myIterator))
1

while(iterator.hasNext()) {
  Object o = iterator.next();
  if (o instanceof B) {
    collection.add((B) o);  
  }
}
0

can not cast Итератор для установки напрямую. Шаблон Iterator предоставляет способ последовательного доступа к элементам агрегатного объекта, не подвергая его основному представлению. Возможное решение заключается вtravel each elements sequentially и добавьте каждый элемент в набор

while (iterator.hasNext()) {
    Object obj = iterator.next();
    set.add(obj.toString());
}
Я имел в виду кастинг для внутренних типов. Если бы у Object не было метода toString, ему потребовалось бы приведение (исходный вопрос был с типами A и B). Поправьте меня, если я ошибаюсь. Whimusical
3

что вы хотите, но проверьте это и посмотрите:

public static void main(String[] args) {
  final Iterator<?> it = Arrays.asList(new Object[] {"a", "b", "c"}).iterator();
  System.out.println(setFromIterator(it));
}

public static Set<String> setFromIterator(Iterator<?> it) {
  final Set<String> s = new HashSet<String>();
  while (it.hasNext()) s.add(it.next().toString());
  return s;
}
7

public Set<B> getBs(){
    Iterator<A> iterator = myFunc.iterator();
    Set<B> result = new HashSet<B>();
    while (iterator.hasNext()) {
        result.add((B) iterator.next();
    }
    return result;
}

As возвращенные итератором не являютсяBs.

Если вы хотите отфильтровать итератор, используйте instanceof:

public Set<B> getBs(){
    Iterator<A> iterator = myFunc.iterator();
    Set<B> result = new HashSet<B>();
    while (iterator.hasNext()) {
        A a = iterator.next();
        if (a instanceof B) {
            result.add((B) iterator.next();
        }
    }
    return result;
}

Используя Гуаву, вышеупомянутое может быть уменьшено до

return Sets.newHashSet(Iterators.filter(myFunc.iterator(), B.class));
3

iterators а такжеcollections что нужно их использовать, а вам нужноiterater быть достаточно общим, чтобы его могли использовать разныеcollections.
Просто используйтеif/else сinstanceof ключевое слово следующим образом:

while(iterator.hasNext()) {
  Object obj = iterator.next();
  if (obj instanceof A) {
    collection.add((A) o);  
  } else if (obj instanceof B) {
    collection.add((B) o);  
  } else if ...etc
}
Я не downvoter, но с одной стороны, я могу понять его / ее. Этот код не очень чистый, и я не вижу много вариантов его использования.
Может ли анонимный переводчик объяснить свои действия?

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