Вы не указали много об интерфейсе, так что я буду просто определить некоторые основы, из которой вы могли бы пойти дальше и разработать более:
Вы можете продолжить итератор , реализовать различные интерфейсы коллекции и все, что вы хотите.
Обратите внимание, что любой код клиента не должен касаться деталей реализации. Осторожно подумайте о интерфейсе своего списка с заблокированной шириной. Интерфейс сообщает клиенту все, что ему нужно сейчас. Как реализуется интерфейс, исключительно забота о классе реализации. Тем не менее, вы можете легко сохранить свой двумерный список с заблокированной шириной как единый, простой java.util.List
. Но скрыть этот список от ваших клиентов.
Вот код, который я предлагаю:
public class BlockedWidthList<T> {
public static void main(String[] args) {
BlockedWidthList<Integer> myList = new BlockedWidthList<Integer>(6);
for(int i = 0; i < 20; i++)
myList.add(i);
for(Integer entry : myList.getRow(2))
System.out.println(entry);
}
/** @throws java.lang.IllegalArgumentException if 'blockedWidthSize' is less than or equal to zero */
public BlockedWidthList(int blockedWidthSize){
if(blockedWidthSize<1)
throw new IllegalArgumentException("Width must be a positive number");
this.blockedWidthSize = blockedWidthSize;
}
public final int blockedWidthSize;
private List<T> internal = new ArrayList<T>();
public void add(T elem){
internal.add(elem);
}
/** Access a row in the blocked width list by a row index. Indexing starts at 0
*
* @return A list containing up to 'blockedWidthSize' elements
* @throws java.lang.IndexOutOfBoundsException if the row does not exist
*/
public List<T> getRow(int rowIndex){
if (rowIndex < 0) throw new IndexOutOfBoundsException("Negative row");
int startIdx = rowIndex * blockedWidthSize;
return internal.subList(startIdx, startIdx + blockedWidthSize);
}
}
Вы можете видеть, что под капотом, этот класс использует только список и целое число. Add
просто перенаправляет вызов в основной список.
Способ, которым вы, возможно, интересуетесь, - getRow
. Давайте подумаем о том, где в списке можно найти i
-й ряд.
Первая строка всегда имеет индекс 0, так как мы добавляем элементы в конце.
Второй ряд начинается после удаления blockWidthSize
Количество элементов. Так как мы 0 индексируется, вторая строка начинается с индекса blockWidthSize
Если вы думаете об этом, первый элемент i
й строки имеет индекс i * blockWidthSize
.
Мы тогда просто возвращаем subList
, начиная с вычисленным индексом и заканчивая blockedWidthSize
элементами позже.
Edit: Очевидно, что этот интерфейс довольно бесполезен: клиент не может знать, может ли он доступ к определенной строке, если он либо не знает, все элементы, которые были введены в список, или если он ловит исключение возникающее при доступе недопустимая строка. Это означает, что в минимальном случае вы должны добавить метод к интерфейсу, который предоставляет информацию о размер списка. Это может быть просто количество элементов (т. Е. Переадресация вызова на internal.size()
или количество строк (которое требует каких-либо вычислений, но не так сложно сделать)
Вопрос: – NPE
Вопрос, отредактированный на последняя строка. –
Я не хочу быть грубым, но я думаю, что вам нужно написать код. Затем покажите это нам и объясните, с какой частью у вас возникают трудности. Тогда мы сможем вам помочь сделайте прогресс. – NPE