Добавление символа Java StringBuilder возвращает нежелательное число - PullRequest
0 голосов
/ 04 июня 2018

Мне очень жаль, если это основной вопрос, на который уже был дан ответ (я пытался найти, но ничего не нашел)

Я пытаюсь написать следующий метод Java:

 String winningCard(String trick, char trump) {
    StringBuilder sb = new StringBuilder();
    char suit;
    char rank;
    for(int i = 1;   i < trick.length(); i+=2) {
        if(trick.charAt(i) == trump) {
            suit = trick.charAt(i);
            rank = trick.charAt(i-1);
            sb.append(rank + suit); //issue here, returns a weird number
            break;
        }
    }
    String result = sb.toString();
    return result;
}

При вызове с этими аргументами "8s7hQd", например, "h", он должен возвращать "7h".

Если я изменю StringBuilder, добавляя только либо иск, либо ранг, онделает это просто нормально, но если я скажу это так, как указано выше, то получится «159», что, я считаю, как-то связано с кодировкой Unicode.

Я был бы очень признателен, если бы кто-нибудь сказал мне, что мне не хватает.

Заранее спасибо

Ответы [ 4 ]

0 голосов
/ 04 июня 2018

+ - хитрая вещь, потому что это означает разные вещи в разных контекстах.

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

Вы даете ему два char с: это числа, поэтому происходит добавление чисел.

Перед добавлением двух символов они расширяются до int;результат тоже int.И именно к этому int вы добавляете конструктор строк, отсюда и «нежелательное» число.

Итак, либо вообще не используйте оператор сложения (лучше всего):

sb.append(rank).append(suit);

Или убедитесь, что вы используете оператор конкатенации строк:

sb.append("" + rank + suit);
// Left-associative, so evaluated as
// ("" + rank) + suit

sb.append(String.valueOf(rank) + suit);
// Etc.

Но на самом деле вам не нужно ничего делать: просто добавьте подстроку:

sb.append(trick, i-1, i+1);

Это извлекает часть строки trick, как trick.substring(i-1, i+1), но делает это без создания новой строки.

И вам не нужен цикл

0 голосов
/ 04 июня 2018
append(rank).append(suit);

Должен сделать трюк

0 голосов
/ 04 июня 2018

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

sb.append(String.valueOf(rank) + String.valueOf(suit))
0 голосов
/ 04 июня 2018

suit и rank в основном числа.+ Добавляет эти числа и добавляет их.

Если вы поместите "" между ними, символы будут добавлены по вашему усмотрению, потому что это заставит компилятор использовать + со строкой.

sb.append(rank + "" + suit);
...