Как сделать заглавной первую букву строки в java?

Производительность конкатенации

При объединении строк вам следует остерегаться возможных проблем с производительностью. Конкатенация двух строк будет преобразована компилятором Java в нечто вроде этого:

String one = "Hello";
String two = " World";

String three = new StringBuilder(one).append(two).toString();

Создается новый StringBuilder, который передает первую строку в свой конструктор, а вторую – в свой метод append(), прежде чем вызвать метод toString(). Этот код фактически создает два объекта: экземпляр StringBuilder и новый экземпляр String, возвращенный методом toString().

При выполнении самих себя в виде одного оператора эти дополнительные затраты на создание объекта незначительны. Однако когда выполняется внутри цикла, это другая история.

Вот цикл, содержащий вышеуказанный тип конкатенации строк:

String[] strings = new String[]{"one", "two", "three", "four", "five" };

String result = null;
for(String string : strings) {
    result = result + string;
}

Этот код будет скомпилирован в нечто похожее на это:

String[] strings = new String[]{"one", "two", "three", "four", "five" };

String result = null;
for(String string : strings) {
    result = new StringBuilder(result).append(string).toString();
}

Теперь для каждой итерации в этом цикле создается новый StringBuilder. Кроме того, объект String создается методом toString(). Это приводит к небольшим расходам на создание экземпляров за одну итерацию: один объект StringBuilder и один объект String. Само по себе не является настоящим убийцей производительности, хотя.

Каждый раз, когда выполняется новый код StringBuilder(result), конструктор StringBuilder копирует все символы из результирующего String в StringBuilder. Чем больше итераций цикла, тем больше будет результат String. Чем больше растет результат String, тем больше времени требуется для копирования символов из него в новый StringBuilder и повторного копирования символов из StringBuilder во временную строку, созданную методом toString(). Другими словами, чем больше итераций, тем медленнее становится каждая итерация.

Самый быстрый способ объединения строк – создать StringBuilder один раз и повторно использовать один и тот же экземпляр внутри цикла. Вот как это выглядит:

String[] strings = new String[]{"one", "two", "three", "four", "five" };

StringBuilder temp  = new StringBuilder();
for(String string : strings) {
    temp.append(string);
}
String result = temp.toString();

Этот код избегает как экземпляров объектов StringBuilder и String внутри цикла, так и, следовательно, позволяет избежать двухкратного копирования символов, сначала в StringBuilder, а затем снова в String.

4 ответа

Лучший ответ

Большая часть размещенной вами логики работает нормально. Проблема заключается в словах типа «SENTENCE», потому что логика, которую вы используете для проверки заглавных букв, неверна.

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

Самый простой способ — разделить проблемы; постарайтесь заранее проверить, написано ли слово с заглавной буквы или нет, и действуйте соответственно.

Сначала создайте метод, который просто проверяет, написано ли слово с заглавной буквы. Например:

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

Для метода следуйте следующей стратегии. Сначала проверьте, написано ли текущее слово с большой буквы:

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

Код может выглядеть так:

Используйте эту стратегию и этот код в качестве руководства, опирайтесь на нее и реализуйте свой собственный метод.

1

dreamcrash
25 Янв 2021 в 21:46

У вас должно быть логическое значение — .

Поначалу это правда.

Во время итерации текста вместо слов вы должны создать новый изменяемый текст с тем же словом.

Если флаг истинен, напишите слово в стиле первых заглавных букв. В противном случае напишите его маленькими заглавными буквами. Если все слово состоит из заглавных букв (поэтому мы перебираем слова) — сразу все слово заглавными буквами.

Если у вас есть «.», Флаг установлен только для 1 слова.

Теперь возьмите приведенный выше текст и сформулируйте его в виде кода. Сообщите нам, если вам понадобится помощь.

1

blackbrandt
26 Янв 2021 в 03:15

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

Затем вы обрабатываете слова каждого предложения, разделяя предложение на «».

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

Затем вы (на последнем этапе) пишете заглавную букву первого слова каждого предложения.

Таким образом, вам вообще не нужны глобальные флаги. И вы можете легко проверить свой алгоритм — на слова и на особые случаи, такие как начало предложения. Если вам нужно добавить другие символы как «.» для разбиения текста на предложения — легко. Если вы хотите особого отношения к другим случаям слов — легко ..

1

juwil
25 Янв 2021 в 22:02

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

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

Контрольная работа:

Выход:

2

Alex Rudenko
25 Янв 2021 в 21:54

Использование Регулярных Выражений

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

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

private static final Pattern[] inputRegexes = new Pattern;

static {
    inputRegexes = Pattern.compile(".*.*");
    inputRegexes = Pattern.compile(".*.*");
    inputRegexes = Pattern.compile(".*\\d.*");
    inputRegexes = Pattern.compile(".*#$%^&*()\\-_=+\\\\|\\};:'\",<.>/?].*");
}

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

private static boolean isMatchingRegex(String input) {
    boolean inputMatches = true;
    for (Pattern inputRegex : inputRegexes) {
        if (!inputRegex.matcher(input).matches()) {
            inputMatches = false;
        }
    }
    return inputMatches;
}

2.1. Одно Регулярное выражение

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

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

Все, что нам нужно сделать, это объявить наше регулярное выражение:

String regex = "^(?=.*?\\p{Lu})(?=.*?\\p{Ll})(?=.*?\\d)" +
    "(?=.*?#$%^&*()\\-_=+\\\\|\\};:'\",<.>/?]).*$";

А затем скомпилируйте и сравните его:

@Test
public void givenSingleRegex_whenMatchingCorrectString_thenMatches() {
    String validInput = "Ab3;";
    assertTrue(Pattern.compile(regex).matcher(validInput).matches());
}

Есть несколько вещей, на которые мы должны обратить внимание в отношении нашего регулярного выражения. Во-первых, мы использовали положительный внешний вид ( ?=X ) для каждой группы символов

Это означает, что мы ожидаем , что X будет найден после начала строки (помеченной ^ ), чтобы соответствовать, но мы не хотим идти в конец X , скорее мы хотим остаться в начале строки

Во-первых, мы использовали положительный внешний вид ( ?=X ) для каждой группы символов . Это означает, что мы ожидаем , что X будет найден после начала строки (помеченной ^ ), чтобы соответствовать, но мы не хотим идти в конец X , скорее мы хотим остаться в начале строки.

Еще следует отметить, что на этот раз мы не использовали или для групп букв, а вместо этого использовали \p{Lu} и \p{Ll} . Они будут соответствовать любой букве (в нашем случае заглавной и строчной соответственно) из любого языка, а не только английского.

JavaScript

JS Array
concat()
constructor
copyWithin()
entries()
every()
fill()
filter()
find()
findIndex()
forEach()
from()
includes()
indexOf()
isArray()
join()
keys()
length
lastIndexOf()
map()
pop()
prototype
push()
reduce()
reduceRight()
reverse()
shift()
slice()
some()
sort()
splice()
toString()
unshift()
valueOf()

JS Boolean
constructor
prototype
toString()
valueOf()

JS Classes
constructor()
extends
static
super

JS Date
constructor
getDate()
getDay()
getFullYear()
getHours()
getMilliseconds()
getMinutes()
getMonth()
getSeconds()
getTime()
getTimezoneOffset()
getUTCDate()
getUTCDay()
getUTCFullYear()
getUTCHours()
getUTCMilliseconds()
getUTCMinutes()
getUTCMonth()
getUTCSeconds()
now()
parse()
prototype
setDate()
setFullYear()
setHours()
setMilliseconds()
setMinutes()
setMonth()
setSeconds()
setTime()
setUTCDate()
setUTCFullYear()
setUTCHours()
setUTCMilliseconds()
setUTCMinutes()
setUTCMonth()
setUTCSeconds()
toDateString()
toISOString()
toJSON()
toLocaleDateString()
toLocaleTimeString()
toLocaleString()
toString()
toTimeString()
toUTCString()
UTC()
valueOf()

JS Error
name
message

JS Global
decodeURI()
decodeURIComponent()
encodeURI()
encodeURIComponent()
escape()
eval()
Infinity
isFinite()
isNaN()
NaN
Number()
parseFloat()
parseInt()
String()
undefined
unescape()

JS JSON
parse()
stringify()

JS Math
abs()
acos()
acosh()
asin()
asinh()
atan()
atan2()
atanh()
cbrt()
ceil()
clz32()
cos()
cosh()
E
exp()
expm1()
floor()
fround()
LN2
LN10
log()
log10()
log1p()
log2()
LOG2E
LOG10E
max()
min()
PI
pow()
random()
round()
sign()
sin()
sinh()
sqrt()
SQRT1_2
SQRT2
tan()
tanh()
trunc()

JS Number
constructor
isFinite()
isInteger()
isNaN()
isSafeInteger()
MAX_VALUE
MIN_VALUE
NEGATIVE_INFINITY
NaN
POSITIVE_INFINITY
prototype
toExponential()
toFixed()
toLocaleString()
toPrecision()
toString()
valueOf()

JS OperatorsJS RegExp
Modifiers:
g
i
m
Groups:

(x|y)
Metacharacters:
.
\w
\W
\d
\D
\s
\S
\b
\B
\0
\n
\f
\r
\t
\v
\xxx
\xdd
\uxxxx
Quantifiers:
+
*
?
{X}
{X,Y}
{X,}
$
^
?=
?!
Properties:
constructor
global
ignoreCase
lastIndex
multiline
source
Methods:
compile()
exec()
test()
toString()

JS Statements
break
class
continue
debugger
do…while
for
for…in
for…of
function
if…else
return
switch
throw
try…catch
var
while

JS String
charAt()
charCodeAt()
concat()
constructor
endsWith()
fromCharCode()
includes()
indexOf()
lastIndexOf()
length
localeCompare()
match()
prototype
repeat()
replace()
search()
slice()
split()
startsWith()
substr()
substring()
toLocaleLowerCase()
toLocaleUpperCase()
toLowerCase()
toString()
toUpperCase()
trim()
valueOf()

Удаление пробелов из строки

Для удаления лишних пробелов из начала и конца строки в языке SQL есть три функции.

Функция LTRIM:

string LTRIM(str string)

Удаляет с начала строки str пробелы и возвращает результат.

Функция RTRIM:

string RTRIM(str string)

Также удаляет пробелы из строки str, только с конца. Обе функции поддерживают многобайтовые символы.

Пример:

SELECT LTRIM (‘   текст   ‘);
Результат: ‘текст   ‘
SELECT RTRIM (‘   текст   ‘);
Результат: ‘  текст’

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

string TRIM( string FROM] str string)

Параметр str обязательный, остальные параметры не обязательные. В случае если задан только один параметр str, то возвращает строку str удалив пробелы из начала и конца строки одновременно.

Пример:

SELECT TRIM (‘   текст   ‘);
Результат: ‘текст’

С помощью пара метра remstr можно задавать символы или подстроки, которые будут удаляться из начала и конца строки. С помощью управляющих параметров BOTH, LEADING, TRAILING можно задавать откуда будут удаляться символы:

  • BOTH — удаляет подстроку remstr с начала и с конца строки;
  • LEADING — удаляет remstr с начала строки;
  • TRAILING — удаляет remstr с конца строки.

Пример:

SELECT TRIM (BOTH ‘а’ FROM ‘текст’);
Результат: ‘текст’
SELECT TRIM (LEADING ‘а’ FROM ‘текстааа’);
Результат: ‘текстааа’
SELECT TRIM (TRAILING ‘а’ FROM ‘ааатекст’);
Результат: ‘ааатекст’

Функция SPACE позволяет получить строку состоящую из определенного количества пробелов:

string SPACE(n integer)

Возвращает строку, которая состоит из n пробелов.

Функция REPLACE нужна для замены заданных символов в строке:

string REPLACE(str string, from_str string, to_str string)

Функция заменяет в строке str все подстроки from_str на to_str и возвращает результат. Поддерживает многобайтные символы.

Пример:

SELECT REPLACE ( ‘замена подстроки’, ‘подстроки’, ‘текста’ )
Результат: ‘замена текста’

Функция REPEAT:

string REPEAT(str string, count integer)

Функция возвращает строку, которая состоит из count повторений строки str. Поддерживает многобайтовые символы.

Пример:

SELECT REPEAT (‘w’, 3);
Результат: ‘www’

Функция REVERSE переворачивает строку:

string REVERSE(str string)

Переставляет в строке str все символы с последнего на первый и возвращает результат. Поддерживает многобайтовые символы.

Пример:

SELECT REVERSE (‘текст’);
Результат: ‘тскет’

Функция INSERT для вставки подстроки в строку:

string INSERT(str string, pos integer, len integer, newstr string)

Возвращает строку полученную в результате вставки в строку str подстроки newstr с позиции pos. Параметр len указывает сколько символов будет удалено из строки str, начиная с позиции pos. Поддерживает многобайтовые символы.

Пример:

SELECT INSERT (‘text’, 2, 5, ‘MySQL’);
Результат: ‘tMySQL’
‘SELECT INSERT (‘text’, 2, 0, ‘MySQL’);
Результат: ‘tMySQLext’
SELECT INSERT (‘вставка текста’, 2, 7, ‘MySQL’);
Результат: ‘SELECT INSERT (‘вставка текста’, 2, 7, ‘MySQL’);’

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

string LCASE(str string) и string LOWER(str string)

Обе функции заменяют в строке str заглавные буквы на прописные и возвращают результат. И та и другая поддерживают многобайтовые символы.

Пример:

SELCET LOWER (‘АБВГДеЖЗиКЛ’);
Результат:’абвгдежзикл’

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

string UCASE(str string) и  string UPPER (str string)

Функции возвращают строку str, заменив все прописные символы на заглавные. Также поддерживают многобайтовые символы.
Пример:

SELECT UPPER (‘Абвгдежз’);
Результат: ‘АБВГДЕЖЗ’

Window

Window Object
alert()
atob()
blur()
btoa()
clearInterval()
clearTimeout()
close()
closed
confirm()
console
defaultStatus
document
focus()
frameElement
frames
history
getComputedStyle()
innerHeight
innerWidth
length
localStorage
location
matchMedia()
moveBy()
moveTo()
name
navigator
open()
opener
outerHeight
outerWidth
pageXOffset
pageYOffset
parent
print()
prompt()
resizeBy()
resizeTo()
screen
screenLeft
screenTop
screenX
screenY
scrollBy()
scrollTo()
scrollX
scrollY
sessionStorage
self
setInterval()
setTimeout()
status
stop()
top

Window History
back()
forward()
go()
length

Window Location
hash
host
hostname
href
origin
pathname
port
protocol
search
assign()
reload()
replace()

Window Navigator
appCodeName
appName
appVersion
cookieEnabled
geolocation
language
onLine
platform
product
userAgent
javaEnabled()
taintEnabled()

Window Screen
availHeight
availWidth
colorDepth
height
pixelDepth
width

Using Scanner

We generally use Scanner to parse primitive types and Strings using regular expressions. A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace.

Let’s find out how to use this to get the first sentence from the example text:

In the above example, we have set the example String as the source for the scanner to use.

Then we are setting the period character as the delimiter (which needs to be escaped otherwise it will be treated as the special regular expression character in this context).

Finally, we assert the first token from this delimited output.

If required, we can iterate through the complete collection of tokens using a while loop.

15 ответов

Лучший ответ

Я думаю, что вы ищете, это аббревиатура поставляемой строки.

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

Вот быстрый пример этого:

117

BotNet
7 Авг 2018 в 15:11

Vadim Gremyachev
18 Май 2016 в 08:01

Альтернатива 1:

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

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

Итак, для вашего случая:

(кстати, есть также , , , если вы хотите узнать больше)

Альтернатива 2:

Сопоставьте все слова и используйте метод , чтобы заменить их первой буквой каждого слова и игнорируйте пробел (метод не изменяет исходную строку)

1

Fatma Nabilla
22 Июл 2018 в 07:20

Версии регулярных выражений для JavaScript не совместимы с Unicode в более старых версиях, чем ECMAScript 6, поэтому для тех, кто хочет поддерживать такие символы, как «å», нужно будет полагаться на версии сценариев, не являющихся регулярными выражениями.

Событие, когда в версии 6 вам нужно указать Unicode с \ u.

SondreB
22 Окт 2015 в 13:56

Самый простой способ без регулярных выражений

20

Almis
3 Апр 2015 в 06:23

Недостаток @BotNet: я думаю, что я решил это после мучительных 3 дней обучающих программ регулярных выражений:

==> Я животное

(раньше ловил m of я) из-за границы слова, кажется, это работает для меня таким образом.

3

tomersss2
15 Апр 2017 в 13:51

Я думаю, ты сможешь сделать это с

Объяснение: Получите все буквенно-цифровых символов , которые встречаются после не алфавитно-цифрового символа (т. е. после границы слова ), поместите их в массив с и объединить все в одну строку

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

20

hugomg
26 Ноя 2011 в 16:48

Это сделано очень просто с ES6

Это работает ТОЛЬКО с пробелами или с тем, что определено в методе

То есть и т. д.

5

Aaron Taddiken
1 Окт 2018 в 16:11

Это должно сработать.

dyoo
26 Ноя 2011 в 17:09

Чтобы добавить к замечательным примерам, вы можете сделать это так в ES6

И это тоже работает, но, пожалуйста, игнорируйте это, я немного сошел с ума здесь :-)

2

Darryl Hebbes
16 Май 2017 в 21:51

Это похоже на другие, но (ИМХО) немного легче читать:

ihake
20 Сен 2019 в 12:12

Как насчет этого:

Madara’s Ghost
26 Ноя 2011 в 16:36

Пытаться —

2

ipr101
26 Ноя 2011 в 16:37

Использование (из функционального программирования)

2

Ben Sarah Golightly
8 Дек 2015 в 11:26

ES6 способ уменьшения:

user3818229
16 Янв 2020 в 09:34

Подстрока (int beginIndex)

Этот метод вернет новый объект String, содержащий подстроку данной строки из указанного startIndex (включительно). Это получит часть String, начинающуюся с заданного beginIndex и до последнего символа String.

Синтаксис таков

public String substring(int beginIndex)

где beginIndex – индекс, с которого начать извлечение возвращаемой подстроки (включительно) Ключевая идея состоит в том, что он получит все символы из индекса, указанного в beginIndex, до последнего символа в строке.

Пример использования Substring в Java

public class SubstringTest {
   public static void main(String[] args) {
      String testString = "ABCDEFGHIJ";
      System.out.println(testString.substring(0));
      System.out.println(testString.substring(1));
      System.out.println(testString.substring(2));
      System.out.println(testString.substring(3));
      System.out.println(testString.substring(4));
      System.out.println(testString.substring(5));
      System.out.println(testString.substring(6));
      System.out.println(testString.substring(7));
      System.out.println(testString.substring(8));
      System.out.println(testString.substring(9));
   }
}

А вот вывод приведенного выше кода.

ABCDEFGHIJ
BCDEFGHIJ
CDEFGHIJ
DEFGHIJ
EFGHIJ
FGHIJ
GHIJ
HIJ
IJ
J

6.6. Analysis of Benchmarks Results

It’s important to note that we’re evaluating the benchmark results in nanoseconds.

After running our JMH test, we can see the average time each took:

  • contains: 14.736 ns
  • indexOf: 14.200 ns
  • containsStringUtilsIgnoreCase: 385.632 ns
  • searchWithPattern: 1014.633 ns

indexOf method is the most efficient one, closely followed by contains. It makes sense that contains took longer because is using indexOf internally.

containsStringUtilsIgnoreCase took extra time compared with the previous ones because it’s case insensitive.

searchWithPattern, took an even higher average time the last one, proving that using Patterns is the worst alternative for this task.

Совместимый ответ

К этому вопросу SO, в bash уже есть много другого способа сделать это. Но у bash есть много особенностей, так называемый bashism который хорошо работает, но это не сработает ни в одной другой shell .

В частности, массивы , ассоциативный массив и подстановка шаблонов являются чистыми bashisms и могут не работать под другими оболочками .

На моем Debian GNU / Linux есть стандартная оболочка под названием dash , но я знаю многих людей, которые любят использовать ksh .

Наконец, в очень маленькой ситуации есть специальный инструмент под названием busybox со своим интерпретатором оболочки ( ash ).

Запрошенная строка

Образец строки в вопросе SO:

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

Разделить строку на основе разделителя в bash (версия> = 4.2)

При чистом bash мы можем использовать массивы и IFS :

Использование этого синтаксиса в недавнем bash не меняет для текущего сеанса, но только для текущей команды:

Теперь строка разделяется и сохраняется в массиве (именованные ):

Мы можем запросить переменный контент с :

— самый быстрый способ сделать раскол, потому что нет вилок и внешних ресурсов.

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

или отбросить каждое поле после обработки (мне нравится этот подход сдвига ):

или даже для простой распечатки (более короткий синтаксис):

Разделить строку на основе разделителя в shell

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

Существует синтаксис, используемый во многих оболочках, для разделения строки на первое или последнее вхождение подстроки:

(Отсутствие этого является основной причиной публикации моего ответа;)

Как указано Score_Under :

Этот небольшой пример скрипта хорошо работает под bash , dash , ksh , busybox и был протестирован также в bash Mac OS:

Повеселись!

compareTo()

Метод compareTo() сравнивает строку с другой и возвращает int, сообщающий, меньше ли эта строка, равна или больше другой.

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

Вот пример:

String one   = "abc";
String two   = "def";
String three = "abd";

System.out.println( one.compareTo(two)   );
System.out.println( one.compareTo(three) );

В этом примере сравнивается одна строка с двумя другими. Вывод:

-3
-1

Числа отрицательны, потому что одна строка находится в порядке сортировки раньше, чем две другие.

Метод compareTo() фактически принадлежит интерфейсу Comparable.

2 ответа

Лучший ответ

Вот пошаговый анализ вашей программы.

Избавьтесь от следующего, так как он не используется.

Инициализация и запуск цикла.

Вот где начинается проблема. Хотя объявлен как , он все равно имеет значение символа ASCII. Таким образом, «0» — «9» на самом деле составляют от 48 до 57 включительно. Поэтому вместо преобразования в целые числа просто сравните их, поскольку они существуют, которые являются символами. В этом случае вы можете забыть оператор%. Так новый оператор if должен быть:

Вместо

Сохраните оставшуюся часть кода, и программа должна нормально работать.

Возможные улучшения

Весь смысл упражнения состоит в том, чтобы проверить, является ли число двоичным. Так что вам не нужно вести бухгалтерию, например, сделайте это. Как только ваш тест для или не пройден, просто верните . Нет необходимости в дальнейшей обработке. Но если вы закончили проверку всей строки и не провалили тест, тогда все символы должны быть 0 или 1. Поэтому верните . Это будет выглядеть так.

Альтернативная логика без может быть:

1

WJS
26 Мар 2020 в 16:34

Я считаю, что ваша проблема здесь: Вы конвертируете tempB в символ, который приводится к int. Но это преобразует его в значение int в ASCII, поэтому каждый символ ‘0’ приводится к 48, а каждое значение ‘1’ — к 49. Примечание: ни 48, ни 49 не равны нулю или одному модулю 10, поэтому ничего не добавляется в корзину

Вам необходимо преобразовать каждый символ в его действительное целочисленное значение (а именно, ноль или единицу) с помощью String.valueOf или Character.getNumericValue:

В противном случае (кроме того факта, что вы никогда нигде не используете переменную b, так что вам это не нужно) ваша логика выглядит довольно здраво.

2

tlong314
25 Мар 2020 в 21:42

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: