Я новичок в программировании и работаю над проектом, в котором я надеялся получить некоторую помощь. Технические характеристики проекта следующие:
Implement the ADT character string as the class LinkedString by using a linked list of characters. Include the following LinkedString constructors and methods:
LinkedString(char[] value)
Allocates a new character linked list so that it represents the sequence of characters currently contained in the character array argument.
LinkedString(String original)
Initializes a new character linked list so that it represents the same sequence of characters as the argument.
char charAt(int index)
Returns the character value at the specified index. The first character in the linked character string is in position zero.
LinkedString concat(LinkedString str)
Concatenates the specified linked character string to the end of this linked character string.
boolean isEmpty()
Returns true if, and only if length() is 0.
int length()
Returns the length of this linked character string.
LinkedString substring(int beginIndex, int endIndex)
Returns a new linked character string that is a substring of this linked character string.
Implement LinkedString so that it mimics the Java String class. For example, character positions should start at zero. Also, keep track of the number of characters in the string with a variable named size; the length should be determined without traversing the linked list and counting the nodes. Remember to include a Test class which creates one or more LinkedString objects and invokes each and every method in your LinkedString ADT.
Итак, у меня есть три класса: класс 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) находится в основном методе, где я пытаюсь отправить целое число (в данном случае номер 2) методу charAt.
Что не так с моим методом charAt (), из-за которого он не может вернуть char в запрошенной позиции индекса?
Кроме того, почему, когда я пытался распечатать список объектов 1 в начале основного метода, я получил только ссылочный адрес, а не само значение?
System.out.print("The original string is " + list1);
System.out.println(chars);
Я знаю, что у меня много проблем с этой программой, и заранее благодарю вас за любую помощь, которую вы можете мне оказать.




Решение:
В методе 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 [] 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;
current = node;
size++;
}
}
печать "list1" печатает ссылку, а не фактическое значение. Решение состоит в том, чтобы переопределить метод toString () и предоставить настраиваемую реализацию, как показано ниже: Обратите внимание, что если вы печатаете любой стандартный объект в java, он вызывает метод toString () по умолчанию, который печатает только ссылку (в основном). переопределив метод toString, мы можем передать строку, которую мы хотим, чтобы Java напечатала.
@Override public String toString () { значение символа []; значение = новый символ [размер]; Узел n = голова;
for(int i=0;i<size;i++){
value[i] = n.item;
n = n.next;
}
String str = String.copyValueOf(value);
return str;
}
«Первая ошибка» (строка 64) не требует пояснений: ваш метод
charAtне компилируется, поскольку он имеет пути кода, которые не ведут к оператору возврата, но метод объявлен как возвращающийchar. Подумайте вот о чем: что произойдет, если аргументindexпримет значение, которое либо отрицательно, либо равно или больше, чемsize? В этом случае вы никогда не дойдете до оператора возврата. Обратите внимание, что в предоставленных выходных данных действительно есть только ошибка один, поскольку это трассировка стека. Слишком упрощенный, он сообщает вам, какая последовательность вызовов приводит к возникновению исключения.