2015-10-17 2 views
4

Я очень неопытен в программировании, так что несите меня.Изменение строки в соответствии с массивом символов

Мне нужно написать класс, который имитирует некоторые атрибуты класса String. В этом конкретном методе я должен взять массив символов и получить строку, чтобы соответствовать ей.

Это то, что я до сих пор:

1 char[] word = new char[80]; 
2 int wordLength = word.length;  
3 
4 public String getString() { 
5  String s; 
6  s.length() = word.length; 
7  for (int i = 0; i < word.length; i++) { 
8   s.charAt(i) = word[i]; 
9  } 
10  return s; 
11 } 

Я должен отметить, что массив символов является нулевым здесь, но в основном методе значения присваиваются ему.

Это ошибка я получаю в строках 6 и 8:

The left-hand side of an assignment must be a variable 

Я понятия не имею, почему он не признающий строки s в качестве переменной.

ответ

4

Ошибка здесь:

s.length() = word.length; 
s.charAt(i) = word[i]; // same here 

Вы пытаетесь присвоить длину возвращаемого значения метода длины.

Также обратите внимание, что String s, неинициализирован.

Простейшая форма getString() будет выглядеть следующим образом:

public String getString() { 
    String s = ""; 
    for (int i = 0; i < word.length; i++) { 
    s = s + word[i]; 
    } 
    return s; 
} 

Было бы лучше использовать StringBuilder вместо конкатенации.

public String getString() { 
    StringBuilder builder = new StringBuilder(); 
    for (int i = 0; i < word.length; i++) { 
    builder.append(word[i]); 
    } 
    return builder.toString(); 
} 
+0

* "Также обратите внимание, что строка s, не инициализирован так он будет бросать NPE во время выполнения ». * Это неверно. Повторите попытку; – Tom

+0

's.charAt (i)' это то, что я имел в виду. – YoungHobbit

+0

Итак, вы думаете, что 's.charAt (i)' будет генерировать исключение во время выполнения, хотя этот код не компилируется? Как это возможно? (Я надеюсь, что эта «подсказка» поможет вам заметить, что «это вызовет исключение NullPointerException во время выполнения» неверно). – Tom

1
s.length() = word.length; 

Вы не можете сделать это. Метод length() - это метод доступа, который обеспечивает размер String. Это не переменная. Обратите внимание:

int variable; // the non-initialized variable 
s.length(); // the method invoking 
variable = s.length(); // the variable initializing 

Вы можете использовать следующий фрагмент кода:

String s = ""; 
for (int i = 0; i < word.length; i++) { 
    s += word[i]; // Both "+" and "+=" operators are a bad practice 
} 
return s; 

Лучше практика заключается в использовании StringBuilder для конкатенации символов в один String:

StringBuilder builder = new StringBuilder(); 
for (int i = 0; i < word.length; i++) { 
    builder.append(word[i]); 
} 
return builder.toString(); 
+0

Не нужно указывать его длину (StringBuilder) изначально, он начинается с 16 символов. –

+1

@KevinAvignon * «начинается с размера 16 символов» *: «StringBuilder» расширяет базовый массив если необходимо. Или вы имеете в виду что-то еще? – Tom

+0

не был уверен в этом! Используется для указания размера для строителя! –

2

s.charAt(i) и s.length() возвращает только значения.

Вам нужно только это:

String s = String.valueOf(word); 
3

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

Переменная - это контейнер, в котором могут храниться значения, и вы можете назначать значения таким контейнерам. Например, в строке

int wordLength = word.length; 

Вы определяете такой контейнер, который вы называете разрядности, и присвоить значение внутри класса переменной word.length.Здесь word.length - это значение, представляющее длину массива символов.

В любом случае, когда попробуете это

s.length() = word.length; 

то имейте в виду, что s.length() является метод, который возвращает значение, а не переменная, поэтому, вы пытаетесь присвоить значение значения. Это не имеет смысла.

2

Вызов длины метода возвращает вам значение. Ошибка вашего кода заключается в том, что вы пытаетесь присвоить значение методу, который возвращает значение, которое не имеет смысла. Во-вторых, для повышения производительности вам было бы лучше использовать класс StringBuilder для создания строки из массива char. Все, что вам нужно сделать при создании, это указать длину с помощью word.length(), а затем внутри цикла for, вы вызываете метод append, который добавит контент в конструктор. Наконец, вы возвращаете строку построителя строк, используя метод toString().

public String getString() { 
     StringBuilder sb = new StringBuilder(word.length); 
     for (int i = 0; i < word.length; i++) { 
      sb.append(word[i].toString());// you must give a string to the string builder 
     } 
    return sb.toString(); 
} 
+0

Подробнее о API-интерфейсе StringBuilder, когда вы берете пик по следующей ссылке: https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html –

5

Я не уверен, если вы имеете право использовать это, но вы можете создать строку из массива символов, например так:

String s = new String(charArray); 

Теперь в код:

String s; 
s.length() = word.length; 

Две проблемы здесь, первая s не инициализирована, прежде чем вы сможете сделать что-то с ней, вам необходимо присвоить ей значение:

String s = new String(); 

Поскольку это создает совершенно новый String лучше использовать следующий код, так как Строки chached:

String s = ""; 

Следующая строка представляет собой неизменное класс, который означает, что вы не можете изменить любые атрибуты, один раз он создан. Plus s.length() возвращает значение int и NO pointer/reference, что означает, что вы не можете присвоить ему новое значение. То же самое касается

s.charAt(i) = word[i]; 

его просто невозможно.

Чтобы создать String полукокса с помощью обугливается вы можете сделать что-то вроде этого:

String s = ""; 
for (char c : charArray) 
{ 
    s += c; 
} 

Обратите внимание, что s += c создает новый String каждый раз.

Лучше использовать StringBuilder:

StringBuilder s = new StringBuilder(); 
for (char c : charArray) 
{ 
    s.append(c); 
} 
s.toString(); 

И опять же, вы можете сделать это в одной строке:.

String s = new StringBuilder().append(charArray).toString(); 
+1

'String s = new String() ; 'Пожалуйста, предпочитайте' String s = ""; 'вместо :). – Tom

+0

Да :). Но вы должны признать, что создание String, подобного OP, которое требуется создать, для начала довольно неэффективно. –

+0

Правильно, но поскольку вам нравится показывать ему лучшие подходы, вы также можете сделать это, избегая пустого конструктора String: D. – Tom

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