Как получить подсписок без использования метода подсписка в Java - PullRequest
1 голос
/ 05 октября 2010

Это то, что у меня есть сейчас:

public ArrayList subList(int fromIndex, int toIndex){
      ArrayList a = new ArrayList();
      for (int i=fromIndex;i<toIndex;i++) {
          a.add(stuff[i]); //stuff is a array of strings
      }
    return list;
  }

Но возможно ли вернуть подсписок без создания нового массива?Я ограничен в использовании любых методов из класса Array / ArrayList.

Ответы [ 5 ]

2 голосов
/ 05 октября 2010

Если вы хотите иметь то же поведение, что и метод Java subList, вам нужно сохранить указатель на исходный список и использовать смещение и длину для индексации в исходном списке.

Вот начало, показывающее реализацию метода get.

public class SubList extends AbstractList {
    private final List original;
    private final int from;
    private final int to;
    public SubList(List original, int from, int to) {
        this.original = original;
        this.from = from;
        this.to = to;
    }

    public Object get(int i) {
        if (i < 0 || i > to - from) {
            throw new IllegalArguementException();
        }

        return original.get(from + i);
    }
}

public static List subList(List original, int from, int to) {
    return new SubList(original, from, to);
}
0 голосов
/ 05 октября 2010

Подсписок - это «новый список», поэтому вам нужно будет создать что-то, что будет представлять подсписок массива. Это может быть либо новый массив, либо список. Вы выбрали ArrayList, который выглядит хорошо для меня. Вы не создаете новый массив (напрямую), поэтому я не понимаю, в чем суть вашего вопроса. (Если вы хотите избежать создания нового массива косвенно через ArrayList, выберите другую реализацию List, например LinkedList)

Если вы ищете небольшие улучшения:

  • Рассмотрите возможность передачи исходного массива в качестве параметра метода. Теперь stuff[] является статическим полем.
  • Рассмотрите возможность инициализации нового ArrayList с размером подсписка (toList-fromList+1)
  • Подумайте об использовании дженериков (только если вы уже сейчас эту концепцию). Таким образом, тип возвращаемого значения будет ArrayList<String>
0 голосов
/ 05 октября 2010

Чтобы избежать создания нового списка для хранения, вам нужно будет передать ссылку на исходный список, сохранить подсписок, а затем удалить оставшиеся элементы из списка, но при этом в списке пропадут эти другие элементы ,

Если это не ваша цель, вам нужно будет создать новый список в какой-то момент для хранения подсписка.

0 голосов
/ 05 октября 2010

Есть три разумные вещи, которые вы могли бы вернуть. Массив, Список или Итератор. Если мое предположение о том, что вы должны заново реализовать subList, было правильным, то нет никакого способа создать новый ArrayList.

0 голосов
/ 05 октября 2010

Я предполагаю, что вы должны вернуть стандартный ArrayList, а не свою собственную версию ArrayList, и я предполагаю, что 'stuff' - это массив, а не список.

Во-первых, получите бонусные баллы за то, что ArrayList имеет начальный размер массива (toIndex - fromIndex). Чтобы получить больше бонусных баллов, убедитесь, что в «вещах» действительно существуют коэффициенты «до» и «от», иначе вы получите хороший сбой.

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

EDIT Вы можете сделать вещи интересными и намного более сложными, но это кого-то впечатлит ... Сделайте это, создав собственный класс ArrayList, реализующий List. Получите его, чтобы использовать этот оригинальный массив. Довольно нестабильно, так как, если этот массив модифицируется где-то еще снаружи, у вас проблемы, но это может быть весело.

...