Java: получение элемента индекса char строки, которая хранится в связанном списке - PullRequest
0 голосов
/ 25 сентября 2018

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

Реализация строки символов ADT в виде класса LinkedString с использованием связанного списка символов.Включите следующие конструкторы и методы LinkedString:

LinkedString (значение char [])

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

LinkedString (String original)

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

char charAt (int index)

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

LinkedString concat (LinkedString str)

Объединяет указанную связанную символьную строку в конец этой связанной символьной строки.

boolean isEmpty ()

Возвращает true, если и только если length () равно 0.

int length ()

Возвращает длину этогосвязанная строка символов.

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

Возвращает новую связанную строку символов, которая является подстрокой этой связанной строки символов.

Реализуйте LinkedString, чтобы он имитировал класс Java String.Например, позиции символов должны начинаться с нуля.Кроме того, следите за количеством символов в строке с переменной с именем size;длина должна быть определена без обхода связанного списка и подсчета узлов.Не забудьте включить класс Test, который создает один или несколько объектов LinkedString и вызывает каждый метод в ADT LinkedString.

Итак, у меня есть три класса: класс LinkedString, класс Node и LinkedStringTestкласс, который запускает основной метод.Пока это то, что у меня есть для класса LinkedString:

public class LinkedString {



    private int size;  //var keeps track of number of characters

    private Node head;

    public LinkedString(){  //no argument constructor

        head = null;

        size = 0;

    }

    public LinkedString(char[] value){

        if(value.length == 0)
        return;    
            Node node = new Node(value[0]);
        head = node;
        size++;
        Node current = head;

        for(int nodeIndex = 1; nodeIndex < value.length; nodeIndex++){            
            node = new Node (value[nodeIndex]);
            current.next = node;
            size++;
        }

    }

    public LinkedString(String original){

        if(original.length() == 0)
            return;
                Node node = new Node(original.charAt(0));
                head = node;
                size++;
                Node current = head;    

        for(int nodeIndex = 1; nodeIndex < original.length(); nodeIndex++){
                node = new Node(original.charAt(nodeIndex));
                current.next = node;
                current = current.next;
                size++;

            }
    }


    public char charAt(int index){

        Node current = head;
        for(int nodeIndex = 0; nodeIndex < size; nodeIndex++){
        if(nodeIndex == index){
            return current.item;}
        else{
            current = current.next;

        }
        }   
    }


    public LinkedString concat(LinkedString str){

        if(str.head == null){
            return this;
        }
        else if(head == null){
            size = str.length();
            return str;
        }
        else{
            Node current = head;
        while(current.next != null)
            current = current.next;
                current.next = str.head;
            size += str.length();
            return this;
        }

    }


    public boolean isEmpty(){
        return length() == 0;     

    }

    public int length(){

        return size;
    }

    public LinkedString substring(int beginIndex, int endIndex){

        String substr = " ";

        for(int nodeIndex = beginIndex; nodeIndex <= endIndex; nodeIndex++)
            substr += charAt(nodeIndex);
        LinkedString linkedSubstring = new LinkedString(substr);
        return linkedSubstring;
    }
}

Это мой класс узла:

public class Node {
    char item;
    Node next;       

    public Node() {
        setItem(' ');
        setNext(null);
    }
    public Node(char newItem) {
        setItem(newItem);
        setNext(null);
    }
    public Node(char newItem, Node newNext) {
        setItem(newItem);
        setNext(newNext);
    }
    public Node(Node newNext) {
        setItem(' ');
        setNext(newNext);
    }
    public void setItem(char newItem) {
        item = newItem;
    }
    public void setNext(Node newNext) {
        next = newNext;
    }
    public char getItem() {
        return item;
    }
    public Node getNext() {
        return next;
    }
}

А это мой класс LinkedStringTest:

import java.util.Scanner; 


public class LinkedStringTest {



    public static void main (String args[]){

        Scanner sc = new Scanner(System.in);
        char[] chars = {'H', 'e', 'l', 'l', 'o'};
        LinkedString list1 = new LinkedString(chars);
        System.out.print("The original string is ");
        System.out.println(chars);
        System.out.println("Is the list empty? " + list1.isEmpty());
        System.out.println("The characters length: " + list1.length());
        System.out.println("Enter the position of a character and press Enter: ");
        int pos1 = sc.nextInt();
        System.out.println("The character at position " + pos1 + " is " + list1.charAt(pos1));
        System.out.println("Enter a string: ");
        String strng1 = sc.next();
        LinkedString list2 = new LinkedString(strng1);
        System.out.println("The string is " + list2);
        System.out.println("That string concatanated with the original string is " + list1.concat(list2));
        System.out.println("Enter the starting and ending index of part of a string ");
        int start = sc.nextInt();
        int end = sc.nextInt();
        System.out.println("The substring from " + start + " to " + end + " is " + list1.substring(start,end));

    }

}

Это вывод, который я получаю, когда запускаю тестовый класс:

run:
The original string is project2.LinkedString@55f96302
Hello
Is the list empty? false

The characters length: 5

Enter the position of a character and press Enter: 

2

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - missing return statement
    at project2.LinkedString.charAt(LinkedString.java:64)
    at project2.LinkedStringTest.main(LinkedStringTest.java:28)
C:\Users\Im\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 47 seconds)

Как вы можете видеть, когда я вхожу в индексную позицию (в данном случае число 2), я получаю сообщения об ошибках.Первая ошибка (строка 64) в начале моего метода charAt.Вторая ошибка (строка 28) связана с методом main, где я пытаюсь отправить целое число (в данном случае число 2) в метод charAt.

Что не так с моим методом charAt (), который не позволяет вернуть символ в запрошенной позиции индекса?
Кроме того, почему, когда я пытался распечатать список объектов1 в началеиз основного метода я получил только адрес ссылки вместо самого значения?

    System.out.print("The original string is " + list1);
    System.out.println(chars);

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

1 Ответ

0 голосов
/ 25 сентября 2018

Решение:

  1. Проблема - отсутствует оператор return.

В методе charAt оператор return находится внутри условия if цикла for.Это означает, что в цикле for будут времена, когда управление программой будет в «else».Итак, Java сбивается с толку, думая, что нет обратного утверждения.Ниже приведено одно из возможных решений, которое устранит проблему.

public char charAt(int index){

    Node current = head;
    for(int nodeIndex = 0; nodeIndex < size; nodeIndex++){
        if(nodeIndex == index) {
            break;
        }
        else{
            current = current.next;

        }
    }

    return current.item;

}

После вышеуказанного изменения, если вы запустите код, вы получите NullPointerException.причина в том, что есть небольшая ошибка конструктора LinkedString.Исправьте, как показано ниже: добавьте строку current.next = node.

public LinkedString (значение char []) {

    if(value.length == 0)
        return;
    Node node = new Node(value[0]);
    head = node;
    size++;
    Node current = head;

    for(int nodeIndex = 1; nodeIndex < value.length; nodeIndex++){
        node = new Node (value[nodeIndex]);
        current.next = node;
        current = node;
        size++;
    }

}

печать «list1» печатает ссылкуа не фактическая стоимость.Решение состоит в том, чтобы переопределить метод toString () и предоставить пользовательскую реализацию, как показано ниже: Обратите внимание, что если вы печатаете любой стандартный объект в java, он вызывает метод по умолчанию toString (), который печатает только ссылку (в основном).переопределив метод toString, мы можем передать строку, которую мы хотим напечатать java.

@ Переопределить public String toString () {char value [];значение = новый символ [размер];Узел n = голова;

for(int i=0;i<size;i++){
    value[i] = n.item;
    n = n.next;
}

String str = String.copyValueOf(value);
return str;

}

...