Как наиболее изящно выполнить итерации через параллельные наборы?

Те изображения плаката, кажется, не имеют корреляции к титульному листу, таким образом, необходимо будет получить титульный лист сначала, и затем получать img элемент для страницы. Хорошие новости - то, что тег img обертывается в тег с именем = "плакат". Вы не сказали, какие инструменты Вы используете, но это в основном операция анализа экранных данных.

49
задан tekumara 1 September 2009 в 17:14
поделиться

5 ответов

Я бы создал новый объект, который инкапсулирует их. Добавьте это в массив и повторите по нему.

List<Person>

Где

public class Person {
    public string name;
    public int age;
}
32
ответ дан 7 November 2019 в 11:30
поделиться
it1 = coll1.iterator();
it2 = coll2.iterator();
while(it1.hasNext() && it2.hasNext()) {
   value1 = it1.next();
   value2 = it2.next();
   do something with it1 and it2;
}

Эта версия прекращает свою работу, когда более короткая коллекция исчерпана; в качестве альтернативы, вы можете продолжить, пока не закончится более длинный, установив значение 1 соответственно. значение2 в null.

64
ответ дан 7 November 2019 в 11:30
поделиться
for (int i = 0; i < names.length; ++i) {
  name = names.get(i);
  age = ages.get(i);
  // do your stuff
}

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

8
ответ дан 7 November 2019 в 11:30
поделиться

Экземпляр перечисления может иметь любое присваиваемое базовому типу (например, int.MinValue - int.MaxValue для любого обычного перечисления) . Вы можете получить список значений с именами , вызвав Enum.GetNames и Enum.GetValues ​​.

.

Есть несколько причин, по которым вы не сможете принять этот подход. Если так ...

A. Вы можете использовать метод обратного вызова, предложенный cletus.

B. Вы по-прежнему можете выбрать итератор, который предоставляет элемент объекта домена для каждого составного экземпляра. Этот подход не заставляет вас поддерживать параллельную структуру списка.

private List<String> _names = ...;
private List<Integer> _ages = ...;

Iterator<Person> allPeople() {
  final Iterator<String> ni = _names.iterator();
  final Iterator<Integer> ai = _ages.iterator();
  return new Iterator() {
    public boolean hasNext() {
      return ni.hasNext();
    }
    public Person next() {
      return new Person(ni.next(), ai.next());
    }
    public void remove() {
      ni.remove();
      ai.remove();
    }
  };
}

C. Вы можете использовать его вариант и использовать API курсора в стиле RowSet. Допустим, IPerson - это интерфейс, описывающий Person. Затем мы можем сделать:

public interface IPerson {
  String getName();
  void setName(String name);
  ...
}

public interface ICursor<T> {
  boolean next();
  T current();
}

private static class PersonCursor implements IPerson, ICursor<IPerson> {
  private final List<String> _names;
  ...
  private int _index = -1;

  PersonCursor(List<String> names, List<Integer> ages) {
    _names = names;
    ...
  }

  public boolean next() {
    return ++_index < _names.size();
  }

  public Person current() {
    return this;
  }

  public String getName() {
    return _names.get(_index);
  }

  public void setName(String name) {
    _names.set(0, name);
  }

  ...
}

private List<String> _names = ...;
private List<Integer> _ages = ...;

Cursor<Person> allPeople() {
  return new PersonCursor(_names, _ages);
}

Обратите внимание, что подход B также может быть использован для поддержки обновлений списка, введя интерфейс домена и заставив Iterator возвращать «живые» объекты.

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

private List<String> _names = ...;
private List<Integer> _ages = ...;

Iterator<Person> allPeople() {
  final Iterator<String> ni = _names.iterator();
  final Iterator<Integer> ai = _ages.iterator();
  return new Iterator() {
    public boolean hasNext() {
      return ni.hasNext();
    }
    public Person next() {
      return new Person(ni.next(), ai.next());
    }
    public void remove() {
      ni.remove();
      ai.remove();
    }
  };
}

C. Вы можете использовать его вариант и использовать API курсора в стиле RowSet. Допустим, IPerson - это интерфейс, описывающий Person. Затем мы можем сделать:

public interface IPerson {
  String getName();
  void setName(String name);
  ...
}

public interface ICursor<T> {
  boolean next();
  T current();
}

private static class PersonCursor implements IPerson, ICursor<IPerson> {
  private final List<String> _names;
  ...
  private int _index = -1;

  PersonCursor(List<String> names, List<Integer> ages) {
    _names = names;
    ...
  }

  public boolean next() {
    return ++_index < _names.size();
  }

  public Person current() {
    return this;
  }

  public String getName() {
    return _names.get(_index);
  }

  public void setName(String name) {
    _names.set(0, name);
  }

  ...
}

private List<String> _names = ...;
private List<Integer> _ages = ...;

Cursor<Person> allPeople() {
  return new PersonCursor(_names, _ages);
}

Обратите внимание, что подход B также может быть использован для поддержки обновлений списка, введя интерфейс домена и заставив Iterator возвращать «живые» объекты.

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

private List<String> _names = ...;
private List<Integer> _ages = ...;

Iterator<Person> allPeople() {
  final Iterator<String> ni = _names.iterator();
  final Iterator<Integer> ai = _ages.iterator();
  return new Iterator() {
    public boolean hasNext() {
      return ni.hasNext();
    }
    public Person next() {
      return new Person(ni.next(), ai.next());
    }
    public void remove() {
      ni.remove();
      ai.remove();
    }
  };
}

C. Вы можете использовать его вариант и использовать API курсора в стиле RowSet. Допустим, IPerson - это интерфейс, описывающий Person. Затем мы можем сделать:

public interface IPerson {
  String getName();
  void setName(String name);
  ...
}

public interface ICursor<T> {
  boolean next();
  T current();
}

private static class PersonCursor implements IPerson, ICursor<IPerson> {
  private final List<String> _names;
  ...
  private int _index = -1;

  PersonCursor(List<String> names, List<Integer> ages) {
    _names = names;
    ...
  }

  public boolean next() {
    return ++_index < _names.size();
  }

  public Person current() {
    return this;
  }

  public String getName() {
    return _names.get(_index);
  }

  public void setName(String name) {
    _names.set(0, name);
  }

  ...
}

private List<String> _names = ...;
private List<Integer> _ages = ...;

Cursor<Person> allPeople() {
  return new PersonCursor(_names, _ages);
}

Обратите внимание, что подход B также может быть использован для поддержки обновлений списка, введя интерфейс домена и заставив Iterator возвращать «живые» объекты.

0
ответ дан 7 November 2019 в 11:30
поделиться

Вы можете создать для него интерфейс:

public interface ZipIterator<T,U> {
  boolean each(T t, U u);
}

public class ZipUtils {
  public static <T,U> boolean zip(Collection<T> ct, Collection<U> cu, ZipIterator<T,U> each) {
    Iterator<T> it = ct.iterator();
    Iterator<U> iu = cu.iterator();
    while (it.hasNext() && iu.hasNext()) {
      if (!each.each(it.next(), iu.next()) {
        return false;
      }
    }
    return !it.hasNext() && !iu.hasNext();
  }
}

И тогда у вас есть:

Collection<String> c1 = ...
Collection<Long> c2 = ...
zip(c1, c2, new ZipIterator<String, Long>() {
  public boolean each(String s, Long l) {
    ...
  }
});
10
ответ дан 7 November 2019 в 11:30
поделиться
Другие вопросы по тегам:

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