2014-11-17 2 views
0

В R вы можете сделать что-то вроде этого:Индекс массива с помощью массива в Java

> x = c(1, 222, 333, 4, 5) 
> x[c(2, 3)] 
[1] 222 333 

> в начале строки это просто подсказка в интерактивной сессии. x - вектор числовых значений, и если вы хотите 2-й и 3-й элементы x, вы передаете другой вектор c (2, 3) в индекс x. Это отличается от Arrays.copyOfRange в java: вы можете передать произвольный индексный вектор в x, не обязательно в непрерывном диапазоне, то есть x [c (1,3,5)]

Мне интересно, есть ли аналогичная функция в java.

+8

Можете ли вы объяснить, что вам нужно? Я не знаю R. – Eran

+1

Если вы потратите минуту, чтобы объяснить, что это значит в R, вы увеличите свой шанс получить ответ от людей, которые не знакомы с R, но знакомы с java. – AlexR

+0

Да, вы правы. См. Мое редактирование, пожалуйста. – qed

ответ

3

Как я понял ваш вопрос, вы можете создать метод, который принимает список индексов в качестве параметров.

Для общих массивов, вы должны будете использовать Array.newInstance и отбрасывать полученный массив T[] (спасибо и престижность для @Radiodef за указание на это)

//for lists 
static <T> List<T> buildList(List<T> original, int... indexes){ 
    List<T> finalList = new ArrayList<>(); 
    for(int index : indexes){ 
     finalList.add(original.get(index)); 
    } 
    return finalList; 
} 

//for arrays 
static <T> T[] buildArray (T[] original, int... indexes){  
    @SuppressWarnings("unchecked") 
    T[] finalArray = (T[])Array.newInstance(original.getClass().getComponentType(), indexes.length); 
    for(int i = 0; i < indexes.length; i++){ 
     finalArray[i] = original[indexes[i]]; 
    } 
    return finalArray; 
} 

Несколько замечаний:

  • Для примитивных массивов (например, int[] или double[]) вам придется перегружать методы, поэтому я предлагаю вам вместо этого использовать List.
  • Индексы массивов в Java являются 0 на основе (начинается от 0 до длины-1)
  • Не забудьте добавить дополнительные проверки для метода (допустимый индекс, первоначальный список или индекс не нулевой)
  • Если у вас использовать LinkedList вместо ArrayList, иметь в виду, что #get(int index) является о (п) операции вместо O (1)

Пример использования:

public static void main(String[] args) { 
    Integer[] xArray = {-1, 10, 24, 7}; 
    List<Integer> xList = Arrays.asList(-1, 10, 24, 7); 

    System.out.println(Arrays.toString(buildArray(xArray, 0, 2))); 
    System.out.println(buildList(xList, 0, 1, 3)); 
} 

Втч ich выходы:

[-1, 24] 
[-1, 10, 7] 
+0

Ваш общий 'buildArray' для' T [] 'неверно. Вам нужно использовать 'Arrays.copyOf' или' Array.newInstance'. Вы не можете сделать '(T []) новый Object [n]' в контексте, где массив возвращается. Это вызовет исключение. – Radiodef

+0

@ Radiodef Зачем это бросать Исключение? – user2336315

+0

Потому что вы бросаете 'Object []' в 'T []' !! Попробуйте это: 'String [] arr = buildArray (new String [] {" a "," b "}, 0, 1);' – Radiodef

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