Те изображения плаката, кажется, не имеют корреляции к титульному листу, таким образом, необходимо будет получить титульный лист сначала, и затем получать img элемент для страницы. Хорошие новости - то, что тег img обертывается в тег с именем = "плакат". Вы не сказали, какие инструменты Вы используете, но это в основном операция анализа экранных данных.
Я бы создал новый объект, который инкапсулирует их. Добавьте это в массив и повторите по нему.
List<Person>
Где
public class Person {
public string name;
public int age;
}
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.
for (int i = 0; i < names.length; ++i) {
name = names.get(i);
age = ages.get(i);
// do your stuff
}
Это не имеет значения. Ваш код не получит баллов за элегантность. Просто сделай так, чтобы заработало. И, пожалуйста, не раздувай.
Экземпляр перечисления может иметь любое присваиваемое базовому типу (например, 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 возвращать «живые» объекты.
Вы можете создать для него интерфейс:
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) {
...
}
});