2014-09-27 2 views
0

Итак, у меня есть 2D Список_массивов благодаря этому вопросу: How to create a Multidimensional ArrayList in Java? И теперь у меня есть это внутри 2D массива, благодаря этому вопросу: Convert ArrayList into 2D array containing varying lengths of arrays«Блок» ArrayList размер

мне нужна ArrayList, чтобы иметь "заблокирован размер ширина" (BWS), то есть, когда размер ArrayList достигает этого числа (BWS), он "ломает" ArrayList линии:

Однако у меня нет идеи, как это сделать :(.

EDIT:

Итак, что я должен делать?

+0

Вопрос: – NPE

+0

Вопрос, отредактированный на последняя строка. –

+3

Я не хочу быть грубым, но я думаю, что вам нужно написать код. Затем покажите это нам и объясните, с какой частью у вас возникают трудности. Тогда мы сможем вам помочь сделайте прогресс. – NPE

ответ

1

Вы не указали много об интерфейсе, так что я буду просто определить некоторые основы, из которой вы могли бы пойти дальше и разработать более:

  • Список с заблокированной шириной должен быть в состоянии добавить элементы

  • следует иметь возможность доступа произвольная строка в списке

Вы можете продолжить итератор , реализовать различные интерфейсы коллекции и все, что вы хотите.

Обратите внимание, что любой код клиента не должен касаться деталей реализации. Осторожно подумайте о интерфейсе своего списка с заблокированной шириной. Интерфейс сообщает клиенту все, что ему нужно сейчас. Как реализуется интерфейс, исключительно забота о классе реализации. Тем не менее, вы можете легко сохранить свой двумерный список с заблокированной шириной как единый, простой 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() или количество строк (которое требует каких-либо вычислений, но не так сложно сделать)

+0

. ArrayList должен быть 2D: ArrayList > –

+1

Почему важна реализация? Если вы хотите, вы всегда можете определить итератор над «BlockedWidthList» и сохранить каждый элемент в «List». –

+0

о, вы правы. Извини за это. +1 –

Смежные вопросы