2013-08-15 2 views
3

Как передать массивы в Java, где я могу указать другой начальный индекс (0-й индекс) для аргумента массива. В C++ вы можете передавать такие массивы, как этоПередайте массив как аргумент, имеющий другой начальный индекс

myMethed(myArray + 3); // passing method where begin index is 4th element 

... 

void myMethod(int* arr) { 
    int val = arr[0]; // refers to the 4th element 
    int val2 = arr[1]; // 5th element 
} 

Как я могу сделать что-то подобное на Java. Я попытался скопировать подмножество массива, используя Arrays.copyOfRange, но мне не нужна отдельная копия, но тот же массив с другим начальным индексом.

Конечно, я могу это сделать:

myMethod(int[] arr, int startIndex) { 
    int val = arr[startIndex]; 
    int val2 = arr[startIndex + 1]; 
} 

Но есть и другие способы, не объявляя отдельный параметр для индекса запуска? Большое спасибо.

+5

Нет нет никакого другого пути. У вас уже есть лучший вариант, если вы не хотите дублировать массив. –

+1

@Rohitjain верен. Основная причина в том, что в java нет арифметики указателей или даже указателей. Поблагодарите божество за ваш выбор. – Bohemian

+0

Нет ничего плохого в вашем собственном решении. Когда вы пишете Java-код, вы должны думать в Java, а не на C++. :) – mrt

ответ

2

, но тот же массив с другим индексом запуска.

В Java массив представляет собой объект, размер которого определен в начальной точке. Начальный индекс всегда равен нулю и размер фиксирован. Эти два значения не могут быть изменены после выделения памяти. В Java такой же массив означает тот же объект и не пространство памяти.

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

0

Вы можете создать итератор, переместить его в нужную позицию и передать в качестве аргумента метода.

0

что об этом?

Integer myarr[] = new Integer[] { 1, 2, 3, 4 }; 
System.out.println(Arrays.toString(Arrays.asList(myarr).subList(2, myarr.length).toArray(new Integer[2]))); 
+1

@RueLeonheart Он копирует массив. –

+1

Почему бы и нет? http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html # toArray% 28T% 5B% 5D% 29 –

+1

Вот источник: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Arrays. java # Arrays.ArrayList.toArray% 28java.lang.Object% 5B% 5D% 29 'toArray' всегда делает копию - не уверен, что вы имели в виду, указывая на этот javadoc (неправильный' ArrayList'). –

2

В целом, prefer collections over arrays. Ваша особая потребность может быть решен с помощью List с вместо:

myMethod(List<Integer> list) { 
    int val = list.get(0); 
    int val2 = list.get(1); 
} 

... 

List<Integer> myList = ...; 
myMethod(myList.subList(3, myList.size())); 

Из List.subList документации:

Возвращает представление части этого списка между указанным fromIndex, включительно, и toIndex, эксклюзивной , (Если fromIndex и toIndex равны, возвращаемый список пуст.) Возвращенный список поддерживается этим списком, поэтому в этом списке отражены неструктурные изменения в возвращаемом списке и наоборот. Возвращенный список поддерживает все дополнительные операции списка, поддерживаемые этим списком.

(курсив мой)

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