Можно ли оптимизировать код на Java для повышения его простоты и читаемости?

Здравствуйте, коллеги! Я хочу получить ответы на свои вопросы от опытных программистов. <br/> У меня есть следующее задание: дан массив с числами в диапазоне от 0 до 100. Нужно написать функцию, которая меняет местами первую и вторую цифру в двухзначных числах, при этом игнорируя однозначные и трехзначные числа. Реализация функции должна быть выполнена с использованием класса ArrayList. <br/> Например, для массива [10, 15, 11, 6, 3, 82, 100] ожидаемый результат: [01, 51, 11, 6, 3, 28, 100]. <br/> Привожу свою реализацию: <br/> <pre><code class="java">import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        
        ArrayList&lt;Integer&gt; numbers = new ArrayList&lt;&gt;();
        
        numbers.add(10);
        numbers.add(15);
        numbers.add(11);
        numbers.add(6);
        numbers.add(3);
        numbers.add(82);
        numbers.add(100);
        
        System.out.println("Исходный массив: " + numbers.toString());
        
        ArrayList&lt;String&gt; result = new ArrayList&lt;&gt;();
        
        for (int number : numbers) {
            if (number &gt;= 10 &amp;&amp; number &lt; 100) {
                String numStr = String.valueOf(number);
                String swapped = numStr.charAt(1) + "" + numStr.charAt(0);
                result.add(swapped);
            } else {
                result.add(String.valueOf(number));
            }
        }
        System.out.println("Измененный массив: " + result.toString());
    }
}</code></pre> <br/> <br/> У меня возникли несколько вопросов: <br/> Как можно упростить реализацию этого задания? <br/> Какие тесты стоит написать для проверки программы? <br/> Есть ли другие рекомендации по улучшению кода?
  • 20 ноября 2024 г. 16:23
Ответы на вопрос 2
Ваш код уже выполняет поставленную задачу, однако его можно сделать более простым и читаемым. Вот несколько рекомендаций по оптимизации:

### Упрощение и Читаемость
1. **Переименование переменных**: Используйте более описательные названия переменных для лучшего понимания кода.
2. **Использование Stream API**: Это упростит обработку коллекций, и позволит избежать явного использования циклов.
3. **Улучшение работы со строками**: Вместо конкатенации строк, можно использовать `String.format` для создания строк.

Вот пример улучшенного кода с учетом приведенных рекомендаций:

```java
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(10);
        numbers.add(15);
        numbers.add(11);
        numbers.add(6);
        numbers.add(3);
        numbers.add(82);
        numbers.add(100);

        System.out.println("Исходный массив: " + numbers);

        List<String> results = numbers.stream()
            .map(Main::swapDigitsIfApplicable)
            .collect(Collectors.toList());

        System.out.println("Изменённый массив: " + results);
    }

    private static String swapDigitsIfApplicable(int number) {
        if (number >= 10 && number < 100) {
            String numStr = String.valueOf(number);
            return String.format("%c%c", numStr.charAt(1), numStr.charAt(0));
        }
        return String.valueOf(number);
    }
}
```

### Пояснения к изменениям
- Использование `List<Integer>` вместо `ArrayList<Integer>` позволяет кодировать более абстрактным образом, что делает его более гибким.
- `map` и `collect` в Stream API также упрощают обработку списков, как и применение метода `swapDigitsIfApplicable` для преобразования.
- Подход с использованием `String.format` также улучшает читаемость.

### Тесты для проверки программы
Для основной функциональности можно написать несколько тестов:

1. Исходные значения:
   - Ввод: `[10, 15, 11, 6, 3, 82, 100]`
   - Ожидаемый результат: `["01", "51", "11", "6", "3", "28", "100"]`

2. Тестирование границ диапазонов:
   - Ввод: `[9, 10, 99, 100]`
   - Ожидаемый результат: `["9", "01", "99", "100"]`

3. Полный 100: 
   - Ввод: `[100]`
   - Ожидаемый результат: `["100"]`

4. Пустой массив:
   - Ввод: `[]`
   - Ожидаемый результат: `[]`

5. Все трехзначные числа:
   - Ввод: `[101, 215, 999]`
   - Ожидаемый результат: `["101", "215", "999"]`

### Рекомендации по улучшению кода
1. **Покрытие тестами**: Рекомендуется использовать фреймворк для тестирования (например, JUnit) для автоматического выполнения тестов.
2. **Обработка исключений**: Убедитесь, что ваш код корректно работает с необычными входными данными и не вызывает ошибок.
3. **Документация**: Добавьте комментарии к коду и документацию к методам, что обеспечит лучшую понимание функциональности кода для других программирующих.

Такие оптимизации и тесты помогут вам сделать ваш код более качественным и надежным.
Ну как базовые два коммента (которые на самом деле не сильно повлияют на что то): не делать второй массив (зачем?) и уж тем более не делать второй массив String. Все таки я бы ожидал от функции что она или в том же массиве все переставит, или вернет новый массив интов. 

Еще для тренировки я бы предложил попробовать заменить преобразование в строку математическими операциями.

UPD. Собственно функцию то вы не написали ;-) Выделите код в функцию
Похожие вопросы