2013-04-18 2 views
0

Я совершенно ошеломлен тем, почему charAt() работает в некоторых сценариях, но не с другими. Я занимаюсь упражнениями, изучая Java, и один из них должен взять строку и вернуть ее в обратном порядке.Использование charAt() для изменения массива символов

Мой рабочий код:

public String reverseString(String tempStr){ 
    int initialindex = tempStr.length()-1; 
    int reverseindex = 0; 
    char tmp; 
    char[] array = new char[tempStr.length()]; 

    for(int tempchar : array){ 
     tmp = tempStr.charAt(initialindex); 
     array[reverseindex] = tmp; 
     initialindex--; 
     reverseindex++; 
    } 
    String returnstr = new String(array); 
    return returnstr; 
} 

Проблема я столкнулся использует следующие for оператор печатает тарабарщина:

for(int tempchar : array){ 
    array[reverseindex] = tempStr.charAt(initialindex); 
    initialindex--; 
    reverseindex++; 
} 

Были, возможно, десятков различных вариантов использования while петли, стандартный for петли и несколько других версий кода, которые были уродливы и не работали. Почему я сделал поле char tmp, поместив проверенный символ в указанное поле, а затем используя указанное поле для ввода данных в массив?

Кроме того, почему я не могу просто вернуть строку, используя return array.toString();?

Редактировать: Я использую последнее Eclipse, которое я загрузил сегодня, переключился с netbeans.

ответ

2
  1. Я скопировал свой код в мой редактор и осуществляется в порядке, используя любую версию, с tmp поле или без него. Возможно, вы сделали другую ошибку, используя другой метод.

  2. Java не поддерживает довольно .toString() для массивов; любой объект, который не переопределяет toString, будет генерировать хеш-код объекта, а не содержимое/поля объекта, а массивы здесь не являются исключением. Хотя это может показаться разумным для массивов символов, одна и та же операция в массиве int создавала бы бессмысленность; См. Разницу между Arrays.toString() и String.valueOf(array). В этом случае вы, вероятно, захотите использовать метод String.valueOf.

+0

Хммм ... Я попробовал другой метод, и я раздражен. Он работает сейчас. Что касается второго ответа, я получил значение '[C @ 3956f14c'. Это хэш-код объекта, о котором вы говорили? – AbeLinkon

+0

В зависимости от реализации функция по умолчанию по умолчанию Object.toString() возвращает 'this.getClass(). GetName() + '@' + Integer.toHexString (this.hashCode());' (или какой-то аналогичный вариант) ,Поэтому я предполагаю, что в этом случае '[C' is 'array' (потому что это своего рода специальный объект), а' 3956f14c' - это hashcode – Trasvi

0

В качестве подсказки, чтобы вы начали: если вы хотите, чтобы преобразовать char массив в String использовать String конструктор, который принимает char массив.

Обновление: Я вижу, что вы уже сделали это в своем редактировании. Работает ли он так, как ожидалось сейчас?

Ваша петля выглядит немного странно, поскольку вы никогда не используете переменную цикла. Вы можете попробовать это:

char[] initialArray = initialStr.toCharArray(); 
char[] array = new char[tempStr.length()]; 

for(int srcIndex = 0, destIndex = array.length-1; destIndex >= 0; srcIndex++, destIndex--) { 
    array[destIndex] = initialArray[srcIndex]; 
} 
+0

Да, я бы использовал его. Но в то время я чувствовал, как забивать квадратный колышек в круглом отверстии, поэтому я просто использовал тупую силу, чтобы сделать это. Плохая практика, но мое терпение было тонким для кажущейся простой проблемы. – AbeLinkon

0

array.toString() возвращение строковое представление объекта. Вам нужно использовать char [] конструктор String new String(array), чтобы создать String из char [].

0
public String reverse(String str) 
     { 
      if(str == null) 
      { 
       return null; 
      } 
      byte[] byteArray= str.getBytes(); 
      int arrayLastIndex = byteArray.length -1 ; 

      for(int i=0 ; i < byteArray.lenght/2: i++) 
      { 
       byte temp = byteArray[i]; 
       byteArray[i] = byteArray[arrayLastIndex -i ] 
       byteArray[arrayLastIndex - i] = temp; 
      } 

      return new String(byteArray); 
     } 
Смежные вопросы