Не понимаю какие изменения нужно внести в код. Строки выдаются методами корректные, но ни один из них не проходит проверку по условию передачи методу null.
Сообщение валидатора:
Убедись, что метод toHex(String) возвращает пустую строку, если на вход получает null
Убедись, что метод toBinary(String) возвращает пустую строку, если на вход получает null.
Остальное проходит.
package com.javarush.task.pro.task09.task0908;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
Двоично-шестнадцатеричный конвертер
*/
public class Solution {
public static void main(String[] args) {
String binaryNumber = "101";
toHex(binaryNumber);
System.out.println("Двоичное число " + binaryNumber + " равно шестнадцатеричному числу " + toHex(binaryNumber));
String hexNumber = "f0d";
System.out.println("Шестнадцатеричное число " + hexNumber + " равно двоичному числу " + toBinary(hexNumber));
}
public static String toHex(String binaryNumber) {
Pattern pattern = Pattern.compile("^[0-1]+$"); // создаём шаблон, которым проверим входящую строку, которая от начала и до конца должна состоять только из нулей и единиц
Matcher m = pattern.matcher(binaryNumber); //создание матчера, сверяющего строку с шаблоном
if (binaryNumber == null || !m.find())
return ""; // проверяем входящий параметр (строку) на null и соответствие шаблону, выдаём пустую строку, если любое условие выполнено
else { // иначе - начинаем подготовку строки к переводу и сам перевод
String a = binaryNumber; // вводим локальную переменную, и далее работаем уже с ней, чтобы не вносить изменений в исходную
final String HEX = "0123456789abcdef"; // строка-массив всех СИМВОЛОВ HEX, которую позже будем использовать для получения символа в системе HEX по индексу в системе DEC
if (a.length() % 4 != 0) { // если бинарное число не кратно 4-м (число символов в исходной строке не делится нацело на 4)
while (a.length() % 4 != 0) // то делаем его таковым,
a = 0 + a; // добовляя впереди нули
}
String[] blocks = new String[a.length() / 4]; // вводим массив из строк, в элементы которого будем вносить кусочки строки (по 4 символа), с числом элементов, в 4 раза меньшим длины исходной строки
double[] index = new double[a.length() / 4];// создаём массив дробных чисел (целые не подходят, потому что будем юзать метод, возводящий в степень, который на вход берёт только doudle
char[] hex = new char[a.length() / 4]; // создание массива одиночных символов. В него будем вносить символы, соответсвующие блокам двоихных символом из массива blocks
String res = ""; // создаём финишную строку, которую будет отдавать метод.Ее заполняем символами из массива символов hex, каждый из которых соответствует "квартету" символов исходной строки
for (int i = 0; i < (a.length()) / 4; i++) { // запускаем самый главный цикл, выполняющий преобразования
blocks[i] = a.substring(i * 4, (i + 1) * 4);// берем подготовленную строку (с числом символов, кратным 4м), и делаем так: элементы с 0го по 3й - в первый элемент массива blocks, во второй с 4го по 7й, в третий - с 8го по 11й и т.д.
for (int j = 0; j < 4; j++) { //подцикл, который подблоки исходной строки...
double jj = j; // обходим ограничение для Math.pow
index[i] = index[i] + Character.getNumericValue(blocks[i].charAt(blocks[i].length() - j - 1)) * Math.pow(2, jj); // ...пересчитывает в десятичную систему счисления...
hex[i] = HEX.charAt((int) index[i] % 16);//...а затем использует десятичное число в качестве индекса строки HEX для поиска в ней символа, соответствующего этому числу в шестнадцатиричной системе
}
res = res + hex[i]; // формирует выводную строку, складывающуюся из указанных выше символов
}
return res; // отдает в результат работы метода полученную строку
}
}
public static String toBinary(String hexNumber) {
Pattern pattern = Pattern.compile("^[0-9 || a-f]+$"); // делаем шаблон для проверки содержимого входящей строки
Matcher m = pattern.matcher(hexNumber); //накладываем шаблон
if (hexNumber == null || !m.find()) // проверяем строку на null и наличие неприемлемых символов
return ""; // возвращаем пустую строку, если входящая не соответствует требованиям
else { // иначе начинаем считать
String a = hexNumber; // создаём копию исходной строки и работаем с ней, чтоб не поломать исходную
String res = ""; // готовим строку, которую будем по итогу выводить
final String HEX = "0123456789abcdef"; // как и в предыдущем методе (хотя, наверно, вторую создавать не стоило, ну для надёжности пусть будет)
int[] index = new int[a.length()]; // численный массив для хранения десятичнх индексов символов
String[] bin = new String[a.length()]; // строковый массив, куда будем вписывать "квартеты" единиц и нулей
char[] hex = new char[a.length()]; // символьный массив для хранения самих символов системы hex, для которых расчитаны десятичне индексы (они же - результаты переводов двоихных "квартетов")
for (int i = 0; i < a.length(); i++) // тут мы инициализируем элементы массива bin пустыми строками,
bin[i] = ""; // чтобы потом было с чем работать
for (int i = 0; i < a.length(); i++)
index[i] = HEX.indexOf(a.charAt(i)); // находим десятичный индекс (он же - численное значение каждого двоичного "квартета") каждого сисмвола входящего числа
for (int i = 0; i < a.length(); i++) {
while (index[i] != 0) {
bin[i] = index[i] % 2 + bin[i]; // пересчитываем индексы в двоичные выражения
index[i] /= 2;
}
if (bin[i].length() % 4 != 0) {
while (bin[i].length() % 4 != 0) // костыль на случай, если предыдущий цикл выдал, например "1". Приводим его к "0001", так как нам нужны "квартеты"
bin[i] = 0 + bin[i];
}
if (bin[i] == "")
bin[i] = "0000"; // костыль, если исходное HEX число содержит 0. Предыдущий цикл посчитает его в пустую строку. Здесь мы преобразуем ее в квартет "0000"
}
for (int i = 0; i < a.length(); i++)
res = res + bin[i]; // формируем строку, которую будет выдавать метод
return res; // выдаем требуемую строку
}
}
}