Конвертировать код с указателями в C в код Java - PullRequest
1 голос
/ 01 февраля 2012

Мне трудно понять, как написать приведенный ниже фрагмент кода, используя String или char[] на Java.

void xyz(char *a, int startIndex, int endIndex)
{
   int j;
   for (j = startIndex; j <= endIndex; j++)
   {
       doThis((a+startIndex), (a+j));
       xyz(a, startIndex+1, endIndex);
   }
}

Здесь char *a указывает на начальное местоположение char name[]

Выше приведены лишь некоторые случайные функции, но мне просто нужна логика использования char* и индекса символов char[] в Java

Ответы [ 4 ]

3 голосов
/ 01 февраля 2012

На основании перефразированного вопроса из цепочки комментариев:

Вы не можете изменить символы Java String.Если вам нужно изменить последовательность символов, используйте StringBuilder, который поддерживает setCharAt(int, char), insert(int, char) и append(char).Вы можете использовать new StringBuilder(myString) для преобразования String в StringBuilder и stringBuilder.toString() для обратного преобразования.

Это совершенно законный код Java - это не вонючий код, это просто способ, которым выработать с изменяемыми последовательностями символов.

3 голосов
/ 01 февраля 2012

Символ * в C, как вы заметили, указывает на начало массива символов (именно так C управляет строками).

В C размер символа равен одному байту, а указатели всегда указывают на начало байта.Ваша строка C представляет собой массив символов, поэтому добавление 1 к указателю смещает начало вашей строки вправо на один символ.

Это означает, что код C:

char *a;
// Set the String here
a = a + 1;

переводится вJava для чего-то вроде:

String a;
// Set the String here
a = a.substring(1);

или если вы используете массив символов:

char[] a;
// Set the array contents here
char[] copyTo = new char[a.length];
System.arraycopy(a, 1, copyTo, 0, a.length);
a = copyTo;

Java будет более осторожно защищать вас, чем будет C.Например, если у вас есть строка нулевой длины, код C может потенциально привести к segfault (сбой приложения) или дать вам бессмысленную строку, заполненную ненужной памятью (а затем, в конечном итоге, сбой приложения), тогда как код Java будетгенерировать исключение (обычно это IndexOutOfBoundsException), которое, как мы надеемся, вы можете обработать аккуратно.

Помните, что String в Java неизменен.Вы не можете изменить их, вы можете только создавать новые строки.К счастью, String имеет несколько встроенных функций, которые позволяют вам выполнять множество стандартных действий, например, заменять часть String другой и возвращать результат.Массив символов является изменяемым, и вы можете изменять символы внутри него, но вы потеряете много приятных преимуществ, которые вы получите от использования соответствующего класса String.

0 голосов
/ 01 февраля 2012

Если ваш метод изменяет значения, которые вы не можете использовать String, поскольку они неизменны, вы можете использовать StringBuilder .

Если ваши методы уже полагаются на массивы символов и вам нужны смещения, которые выможно использовать CharBuffer , чтобы обернуть массив.Он не поддерживает строковые операции, но поддерживает представления для поддиапазонов, что, по-видимому, и используется в методе doThis().

0 голосов
/ 01 февраля 2012

Простой ответ:

Вы не можете сделать это точно. Java передается только по ссылке. У вас нет доступа к информации о местоположении в памяти, поэтому вы не можете выполнять арифметику с ней.

Более длинный ответ:

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

  1. Вы можете преобразовать строку в массив символов, а затем передать символ []. Если ваши манипуляции не являются какой-либо стандартной строковой операцией и полностью настраиваются, это, вероятно, то, что вам нужно сделать. Имейте в виду, что вы не можете изменить размер передаваемого массива и не можете указать точку на новом массиве после завершения функции. (опять же, только передать по значению). Только значения существующих элементов массива могут быть изменены.
  2. Вы можете передать String и использовать методы String, такие как subString () (что, как вам кажется, предлагает ваш начальный и конечный индексы, но это может не соответствовать вашим потребностям. Обратите внимание, что строки неизменяемы, и вы можете только получить результат с помощью оператора return.
  3. Если вам действительно нужно изменить содержимое переданного объекта, вы можете передать объект StringBuilder, StringBuffer или CharBuffer и изменить его.

Есть хак, который также можно использовать для обхода передачи по ссылке, но это плохой стиль, за исключением особых ситуаций. Передайте массив того, что вам нужно изменить, так что в этом случае массив массива символов позволит вам установить новый подмассив и эффективно добиться передачи по ссылке, но постарайтесь не делать этого:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...