Java:获取存储在链表中的字符串的 char 索引元素



我是编程新手,正在做一个我希望能得到一些帮助的项目。项目规范如下:

使用

字符的链接列表。包括以下链接字符串 构造函数和方法:

链接字符串(字符[] 值(

分配一个新的字符链表,以便它表示 字符数组中当前包含的字符序列 论点。

链接字符串(字符串原文(

初始化新的字符链表,使其表示相同的 字符序列作为参数。

charcharAt(int index(

返回指定索引处的字符值。 第一个 链接字符串中的字符位于位置 0。

LinkedStringconcat(LinkedString str(

将指定的链接字符串连接到此字符串的末尾 链接的字符串。

布尔值是空((

当且仅当 length(( 为 0 时返回 true。

整数长度((

返回此链接字符串的长度。

LinkedString substring(int beginIndex, int endIndex(

返回一个新的链接字符串,该字符串是 this 的子字符串 链接的字符串。

实现 LinkedString,使其模仿 Java String 类。 为 例如,字符位置应从零开始。 另外,请跟踪 字符串中带有名为 size 的变量的字符数; 长度应在不遍历链表的情况下确定,并且 计算节点数。 请记住包含一个 Test 类,该类创建 一个或多个 LinkedString 对象,并调用 您的链接字符串 ADT。

所以我有三个类:LinkedString 类、Node 类和运行 main 方法的 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:UsersImAppDataLocalNetBeansCache8.2executor-snippetsrun.xml:53: Java returned: 1
BUILD FAILED (total time: 47 seconds)

如您所见,当我输入索引位置(在本例中为数字 2(时,我会收到错误消息。第一个错误(第 64 行(位于我的 charAt 方法的开头。第二个错误(第 28 行(在 main 方法中,我尝试将整数(在本例中为 2(发送到 charAt 方法。

我的 charAt(( 方法做错了什么,以至于它无法在请求的索引位置返回 char?
另外,为什么当我尝试在 main 方法开头附近打印出对象 list1 时,我只得到了引用地址而不是值本身?

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

我知道我对这个程序有很多问题,我提前感谢您给我的任何帮助。

解决方案:

  1. 问题 - 缺少返回语句。

在 charAt 方法中,return 语句位于 for 循环的 if 条件内。这意味着在 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;
}
  1. 在上述更改之后,如果您运行代码,您将获得 NullPointerException。 原因是有一个微妙的错误 LinkedString 构造函数。修复如下 - 添加行当前.next = 节点。

    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++;
    }
    }
    
  2. 打印
  3. "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;
    

    }

相关内容

  • 没有找到相关文章

最新更新