#java #algorithm #function #class #oop
Вопрос:
Я изучаю Java и удивляюсь, как я могу получить два числа в одной строке.
Этот алгоритм в порядке, что я могу улучшить? Что вы можете мне предложить?
import java.util.Scanner;
public class Main{
public static int Separate(String Values, int Order){
String toReturn = "";
int Counter = 0;
for(int Iterator = 0; Iterator < Values.length(); Iterator = Iterator 1){
if(Values.charAt(Iterator) == ' ') {
if(Order == Counter) break;
else{
toReturn = "";
Counter = Counter 1;
}
}
else toReturn = Values.charAt(Iterator);
}
return Integer.parseInt(toReturn);
}
public static void main(String[] args){
Scanner Entry = new Scanner(System.in);
System.out.print("Enter two numbers separated by space: ");
String Number = Entry.nextLine();
int Frst = Separate(Number, 0);
int Scnd = Separate(Number, 1);
}
}
Комментарии:
1. Значит, код уже работает? Я думаю, что обзор кода лучше (прочитайте их справочный центр, прежде чем спрашивать)
2. Да, это работает.
3. Ваш код может вести себя не так, как предполагалось, если между числами находится более одного пробела. Я бы рекомендовал использовать
Values.split("\s ")
для разделения строки, где есть хотя бы один пробел.4. Примечание: В Java широко используется соглашение, согласно которому имена переменных начинаются со строчного символа.
5. Вы правы, @MrSmith42. Не работаю с еще одним пространством. Я постараюсь это исправить. Спасибо.
Ответ №1:
что я могу улучшить? Что вы можете мне предложить?
Примите соглашения об именах Java:
- Имена методов
camelCase
, начинающиеся со строчной буквы - Имена полей и свойств , а также Имена аргументов метода
camelCase
тоже
В основном только имена классов и интерфейсов начинаются с прописной буквы в Java.
public static int separate(String values, int order){
String toReturn = "";
int counter = 0;
for(int iterator = 0; ...) { ...
Иначе я бы сказал: этот алгоритм довольно надежен для новичка. Легко понять, что происходит.
Конечно, Java предоставляет гораздо более сложные инструменты для решения этой проблемы, используя , например, регулярные выражения с myString.split(...)
или потоки с. IntStream intStream = myString.chars()
И последнее, но не менее важное, вы могли бы добавить обработку исключений: Что произойдет, если Integer.parseInt
задано какое-то не-число? Он разобьется.
try {
return Integer.parseInt(toReturn);
} catch (NumberFormatException e) {
// when "toReturn" cannot be parsed to an int, return a
// default value instead of crashing your application
return 0;
}
Или, если сбой является желаемым поведением, или вы можете убедиться, что этот метод никогда не вызывается с недопустимой строкой, оставьте его как есть (= не добавлять try catch
)
Ответ №2:
Я думаю, что то, что вы сделали, отлично подходит для хорошо отформатированного ввода, где между цифрами есть один пробел. Как указывали другие, соблюдение соглашений об именовании Java значительно улучшит читабельность вашего кода.
Обработка последовательностей пробелов, возможных до, между и после ваших чисел, немного сложнее. Общая схема состояла бы в том, чтобы использовать любые последовательности пробелов, запоминать текущую позицию, использовать последовательность цифр, а затем, если мы находимся в правильном положении, возвращать проанализированное число.
public static int separate(String str, int order)
{
for(int i = 0, pos = 0; ; pos )
{
while(i < str.length() amp;amp; str.charAt(i) == ' ') i = 1;
int j = i;
while(i < str.length() amp;amp; str.charAt(i) != ' ') i = 1;
if(i == j) throw new IllegalStateException("Missing number!");
if(order == pos)
{
// handle NumberFormatException
return Integer.parseInt(str.substring(j, i));
}
}
}
Тест:
String s = " 23432 798 44";
for(int i=0; i<3; i )
System.out.print(separate(s, i) " ");
Выход:
23432 798 44