2010-10-05 3 views
1

Это то, что я прямо сейчас:Как получить подсписок без использования методы подсписка в Java

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.

+0

Ваша задача - реализовать 'subList' самостоятельно? Также неясно, для чего нужен массив 'stuff'. –

+0

да это правильно. stuff - это массив строк, которые я тестирую. – Dan

+0

и какой метод должен возвращаться? –

ответ

0

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

Прежде всего, получите бонусные баллы за то, что ArrayList имеет начальный размер массива (toIndex - fromIndex). Чтобы получить больше бонусных очков, убедитесь, что в «вещи» на самом деле есть и от «indecies», иначе вы получите хороший сбой.

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

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

0

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

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

+0

Выше отмечалось, что «материал» представляет собой массив, а не список. – Moncader

+0

Я тоже об этом думал, но я не могу использовать какие-либо методы из класса Array, так что нет способа удалить – Dan

0

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

0

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

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

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

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

Это начало, показывающее реализацию метода 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

Ahh, предположим, это то, что искали OP. Ницца. Вы завершаете «Список», но если вы хотите обернуть массив, решение будет аналогичным. –

+0

+1. для полного поведения подвыражений Java вам также необходимо поддерживать удаление и очистить и так далее. – Thilo

+0

есть способ реализовать без таких методов, как добавление, удаление, получение, сохранение, установка и т. Д.? – Dan

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