Почему моя реализация интерфейса не работает?

Я сделал проект Java, который принимает строку чисел и выполняет некоторые движения в методах интерфейса для получения результата. Я протестировал это без реализации интерфейса, и он отлично работал и давал правильный результат. Вот файлы NumberRangeSummarizerImpl (пока нет взаимодействия с файлом интерфейса, работает отлично)

import java.util.*;
//import numberrangesummarizer;

public class NumberRangeSummarizerImpl {

    public Collection<Integer> collect(String input) 
    {
        
        // Split the input string into individual number strings and parse them into integers
        String[] numberStrings = input.split(",");
        List<Integer> numbers = new ArrayList<>();
        for (String numberString : numberStrings) {
            try {
                int number = Integer.parseInt(numberString.trim());
                numbers.add(number);
                //numbers are added to an arraylist 
            } catch (NumberFormatException e) {
                // Ignore any non-integer input values t7hfy6h6tg6 number int add the sorted list t
            }
        }
        return numbers;
    }

    
    public String summarizeCollection(Collection<Integer> input) {
        if (input == null || input.isEmpty()) {
            return "Input invalid.";
        }
        // Sort the input numbers ASC
        List<Integer> sortedNumbers = new ArrayList<>(input);
        Collections.sort(sortedNumbers);
        
        // compile output string
        StringBuilder sb = new StringBuilder();
        int startNumber = sortedNumbers.get(0);
        int lastNumber = startNumber;
        sb.append(startNumber);
        for (int i = 1; i < sortedNumbers.size(); i++) {
            int number = sortedNumbers.get(i);
            if (number == lastNumber + 1) {
                // The current number is sequential to the previous number
                lastNumber = number;
            } else {
                // The current number is not sequential to the previous number
                if (lastNumber > startNumber) {
                    // Output a range of numbers instead of just the lastNumber
                    sb.append("-").append(lastNumber);
                }
                sb.append(", ").append(number);
                startNumber = number;
                lastNumber = number;
            }
        }
        // Handle the last range of numbers, if there was one
        if (lastNumber > startNumber) {
            sb.append("-").append(lastNumber);
        }
        return sb.toString();
    }
}

App.java (где находится main)

import java.util.*;
public class App {
    public static void main(String[] args) throws Exception {
        NumberRangeSummarizerImpl summarizer = new NumberRangeSummarizerImpl();
        //Collection<Integer> inputNumbers = summarizer.collect("1,3,6,7,8,12,13,14,15,21,22,23,24,31");
        Collection<Integer> inputNumbers = summarizer.collect("1,1,3,6,7,8,12,13,14,15,21,22,23,24,25,26,27,31");
        String outputString = summarizer.summarizeCollection(inputNumbers);
        System.out.println(outputString);
    }
}

Теперь я сделал java-файл интерфейса в той же папке (src)

package numberrangesummarizer;

import java.util.Collection;
public interface NumberRangeSummarizer {

    //collect the input
    Collection<Integer> collect(String input);

    //get the summarized string
    String summarizeCollection(Collection<Integer> input);

}

Теперь мне нужно использовать интерфейс, реализовав его в NumberRangeSummarizerImpl.

import java.util.*;
import numberrangesummarizer;

public class NumberRangeSummarizerImpl implements NumberRangeSummarizer {

    public Collection<Integer> collect(String input) 
    {
        
        // Split the input string into individual number strings and parse them into integers
        String[] numberStrings = input.split(",");
        List<Integer> numbers = new ArrayList<>();
        for (String numberString : numberStrings) {
            try {
                int number = Integer.parseInt(numberString.trim());
                numbers.add(number);
                //numbers are added to an arraylist 
            } catch (NumberFormatException e) {
                // Ignore any non-integer input values t7hfy6h6tg6 number int add the sorted list t
            }
        }
        return numbers;
    }

    
    public String summarizeCollection(Collection<Integer> input) {
        if (input == null || input.isEmpty()) {
            return "Input invalid.";
        }
        // Sort the input numbers ASC
        List<Integer> sortedNumbers = new ArrayList<>(input);
        Collections.sort(sortedNumbers);
        
        // compile output string
        StringBuilder sb = new StringBuilder();
        int startNumber = sortedNumbers.get(0);
        int lastNumber = startNumber;
        sb.append(startNumber);
        for (int i = 1; i < sortedNumbers.size(); i++) {
            int number = sortedNumbers.get(i);
            if (number == lastNumber + 1) {
                // The current number is sequential to the previous number
                lastNumber = number;
            } else {
                // The current number is not sequential to the previous number
                if (lastNumber > startNumber) {
                    // Output a range of numbers instead of just the lastNumber
                    sb.append("-").append(lastNumber);
                }
                sb.append(", ").append(number);
                startNumber = number;
                lastNumber = number;
            }
        }
        // Handle the last range of numbers, if there was one
        if (lastNumber > startNumber) {
            sb.append("-").append(lastNumber);
        }
        return sb.toString();
    }
}

Он вызывает пакет, интерфейс находится в той же папке, что и Impl, но выдает ошибку, когда не может разрешить NumberRangeSummarizer.

Я не понимаю, почему? Почему это не работает?

это: импортировать numberrangesummarizer; выглядит очень коварно. Это имя пакета. Вы импортируете классы, а не пакеты, или добавляете .* в конце, указывая, что вы импортируете все классы в этом пакете.

Stultuske 24.04.2023 14:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не думаю, что ваше утверждение import верно. Это неправильный синтаксис, это должно быть import package.Type или import package.*.

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

Я удалил оператор импорта, потому что все файлы находятся в одном пакете, и тем не менее я получаю сообщение об ошибке «NumberRangeSummarizer не может быть преобразовано в тип Java (16777218)» при реализации NumberRangerSummarizer.

MillsBills 24.04.2023 17:15
Ответ принят как подходящий

Я попытался восстановить вашу проблему, где все три файла существуют в папке src, и это сработало без import numberrangesummarizer;.

Вы пробовали удалить это утверждение?

Вообще говоря, это плохая практика для файлов, не входящих в именованный пакет

При удалении оператора импорта возникает ошибка «общедоступный класс NumberRangeSummarizerImpl реализует NumberRangeSummarizer {» NumberRangeSummarizer не может быть преобразован в тип Java (16777218). Возможно, у вас есть файлы? я не могу заставить свою работать

MillsBills 24.04.2023 17:13

@MillsBills Вы пытались очистить и перестроить решение? Иногда при рефакторинге дела идут плохо.

fnymmm 24.04.2023 20:09

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

MillsBills 25.04.2023 10:22

Другие вопросы по теме