2014-10-27 2 views
0

Я пробовал несколько версий, в том числе несколько решений, найденных здесь в StackOverflow, но я всегда получаю числа вместо символов в консоли. Для домашней работы в моем uni нам нужно инвертировать символы в строке. Но создание новой строки, кажется, не так просто.Java-символ для String

Я попытался с помощью StringBuilder,

StringBuilder builder = new StringBuilder(); 
// ... 
builder.append(c); // c of type char 

Объединение строк,

System.out.print("" + c); // c of type char 

и даже String.valueOf(),

System.out.print(String.valueOf(c)); // c of type char 

и каждый из них снова с явным приведением до char. Но я всегда получаю порядковый номер символов в последовательности вместо фактических символов в качестве вывода в консоли. Как правильно построить новую строку из char?

/** 
* Praktikum Informatik - IN0002 
* Arbeitsblatt 02 - Aufgabe 2.6 (Buchstaben invertieren) 
*/ 

public class H0206 { 

    public static String readLine() { 
     final StringBuilder builder = new StringBuilder(); 
     try { 
      // Read until a newline character was found. 
      while (true) { 
       int c = System.in.read(); 
       if (c == '\n') 
        break; 
       builder.append(c); 
      } 
     } 
     catch (java.io.IOException e) { 
      ; // We assume that the end of the stream was reached. 
     } 
     return builder.toString(); 
    } 

    public static void main(String[] args) { 
     // Read the first line from the terminal. 
     final String input = readLine(); 

     // Create a lowercase and uppercase version of the line. 
     final String lowercase = input.toLowerCase(); 
     final String uppercase = input.toUpperCase(); 

     // Convert the string on the fly and print it out. 
     for (int i=0; i < input.length(); ++i) { 
      // If the character is the same in the lowercase 
      // version, we'll use the uppercase version instead. 
      char c = input.charAt(i); 
      if (lowercase.charAt(i) == c) 
       c = uppercase.charAt(i); 
      System.out.print(Character.toString(c)); 
     } 
     System.out.println(); 
    } 

} 
+4

'c' типа' char'? Тот, который я вижу в вашем примере, это 'int'. Кроме того, что делает 'System.in.read()' do? –

+0

['String # valueOf()' shoud work] (http://stackoverflow.com/questions/8172420/how-to-convert-a-char-to-a-string-in-java) ... Вы уверен, что вы не цифра, например ' '4''? – sp00m

+0

'c' может содержать символьные данные, но это, безусловно, тип' int', а не 'char'. Преобразуйте его в 'char' следующим образом:' char ch = (char) c; '. – icza

ответ

0

Вот пример, как инвертировать строку, есть еще варианты, я думаю, что это один более дидактичность

public static void main(final String[] args) { 
    String text = "This is a string that will be inverted"; 
    char[] charArray = text.toCharArray(); 
    char[] invertedCharArray = new char[charArray.length]; 
    for (int i = 1; i <= charArray.length; i++) { 
     char c = charArray[charArray.length - i]; 
     invertedCharArray[i - 1] = c; 
    } 
    System.out.println(text); 
    System.out.println(new String(invertedCharArray)); 
} 
2

Проблема я вижу пример кода, который вы указали здесь:

int c = System.in.read(); 
if (c == '\n') 
    break; 
builder.append(c); 

Вызовите способ, который вы называете методом, Stringbuilder.append(int). Как говорит javadoc, «общий эффект точно такой, как если бы аргумент был преобразован в строку методом String.valueOf (int), а символы этой строки были добавлены к этой последовательности символов». Кастинг целое-значение обугливается, как это приведет к желаемому поведению:

int c = System.in.read(); 
if (c == '\n') 
    break; 
builder.append((char) c); 
0
try { // Read until a newline character was found. 
     while (true) { 
      int c = System.in.read(); 
      if (c == '\n') break; 
      builder.append(c); 
     } 

Из образца вы дали, я могу видеть, что это является причиной проблемы. Поскольку вы читаете вход char как int, он преобразует символ в его порядковое значение, поэтому его можно сохранить (и, следовательно, использовать) как целое.

В public final class StringBuilder вы звоните append(int i), который возвращает int. Если для этого объявляется целое число int c = System.out.read(); , вы можете отличить c до символа.

char ch = (char)c; 
builder.append(ch) 

При необходимости, это оставляет с как целое число и сохраняет его «исходное значение» (Что это было до того, как был превращен в int, т.е. нажатой клавиши) в переменной, если это необходимо. Если вам нужно только добавить его в строку, без повторного использования по какой-либо причине, вы можете отличить c до char с помощью append((char) c).