Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为链表类的子字符串开发替换方法_Java_String_Linked List_Sublist - Fatal编程技术网

Java 为链表类的子字符串开发替换方法

Java 为链表类的子字符串开发替换方法,java,string,linked-list,sublist,Java,String,Linked List,Sublist,我有一个类LString,它模仿标准的Java字符串和StringBuilder类。我在开始实现替换方法以将子字符串“LString”中的字符替换为“lStr”中的字符时遇到问题。我的replace方法位于代码的底部 如果start==end,则会给出特殊情况,这将在LString中的给定位置插入“lStr”。如果start==end==this.length(),则在这个LString的末尾追加lStr public class LString { node front; i

我有一个类LString,它模仿标准的Java字符串和StringBuilder类。我在开始实现替换方法以将子字符串“LString”中的字符替换为“lStr”中的字符时遇到问题。我的replace方法位于代码的底部

如果start==end,则会给出特殊情况,这将在LString中的给定位置插入“lStr”。如果start==end==this.length(),则在这个LString的末尾追加lStr

public class LString {

    node front;
    int length;
    LString next;

    // create node class
    public class node {
        char data;
        node next;

        public node(char newData) {
            data = newData;
        }

        public node(char newData, node newNext) {
            data = newData;
            next = newNext;
        }
    }

    // LString constructor
    // constructs LString object representing empty list of chars
    public LString(){
        this.length = 0;
        this.front = null;
    }

    // Construct LString copy of original parameter
    public LString(String original){
        //assign first char to front
        node curr = this.front;
        this.length = original.length();
        // loop through
        for (int i = 0; i < original.length(); i++) {
            if (i==0) {
                front = new node(original.charAt(i), null);
                curr = front;
            }else{
                curr.next = new node(original.charAt(i), null);
                curr = curr.next;
            }
        }
    }

    // return length in this LString
    // can use in LString constructor
    public int length(){
        return this.length;
    }

    //create and return string with contents of LString
    public String toString(){
        // use string builder to meet time limit
        StringBuilder builder = new StringBuilder();
        if(front == null){
            return "";
        }else{
            node curr = front;
            while(curr != null){
                builder.append(curr.data);
                curr = curr.next;

            }
            return builder.toString();
        }
    }

    //compares string lists 0 if equal -1 if less, and 1 if greater
    public int compareTo(LString anotherLString){
        //save lowest length of strings
        int minLength;
        // get front spots
        node curr = this.front;
        node otherCurr = anotherLString.front;
        // get lengths
        int thisString = length();
        int otherString = anotherLString.length();
        // get shortest length of 2 strings
        if(thisString < otherString){
            minLength = thisString;
        }else {
            minLength = otherString;
        }
        //go through characters in each string and compare for lexicographic order
        int iterate = 0;
        while(iterate < minLength){
            char string1Char = curr.data;
            char string2Char = otherCurr.data;
            if  (string1Char != string2Char) {
                return string1Char - string2Char;
            }
            iterate++;
            curr = curr.next;
            otherCurr = otherCurr.next;
        }
        return thisString - otherString;
    }

    //Return true if LString represents the same list of characters as other
    @Override
    public boolean equals(Object other) {
        if (other == null || !(other instanceof LString))
            return false;
        else{
            // use compareTo to determine if strings are the same
            LString otherLString = (LString)other;
            if(compareTo(otherLString) == 0){
                return true;
            }else{
                return false;
            }
        }
    }

    //Return the char at the given index in this LString.
    public char charAt(int index){
        int length = this.length();
        // check for index out of bounds
        if(index < 0 || index >= length){
            throw new IndexOutOfBoundsException();
        }
        // returns char at index
        node curr = front;
        for (int i = 0; i < index; i++) {
            curr = curr.next;
        }
        return curr.data;
    }

    //Set the char at the given index in this LString to ch.
    public void setCharAt(int index, char ch){
        // check for index out of bounds
        int length = this.length();
        if(index < 0 || index >= length){
            throw new IndexOutOfBoundsException();
        }
        // replaces char at index
        node curr = front;
        for (int i = 0; i < index; i++){
            curr = curr.next;
        }
        curr.next = new node(curr.data,curr.next);
        curr.data = ch;
    }

    //Returns a new LString that is a sub-string of this LString.
    public LString substring(int start, int end) {
        LString newLString = new LString();
        // handle exceptions
        if (start < 0 || start > end) {
            throw new IndexOutOfBoundsException();
        } else if (end > this.length()) {
            throw new IndexOutOfBoundsException();
            //return null in special case (empty LString)
        } else if (start == end) {
            //&& end == this.length()
            return newLString;
        } else {
            node node = this.front;
            for (int i = 0; i < start; i++) {
                node = node.next;
                // insert substring
            }
            node copy = new node(node.data);
            newLString.front = copy;
            for (int i = start + 1; i < end; i++) {
                node = node.next;
                copy = copy.next = new node(node.data);
            }
            return newLString;
        }
    }

    // Replaces this characters in a sub-string of this LString with the characters in lStr.
    public LString  replace(int start, int end, LString lStr) {

        // handle exceptions
        if(start <0 || start >end) {
            throw new IndexOutOfBoundsException();
        } else if (end > this.length()) {
            throw new IndexOutOfBoundsException();
    }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        return null;
} // end class
        /*
                // create new LString
        LString newLString = new LString();

        node node = this.front;
        // to copy
        node copy = new node(node.data);
        // for node to replace
        node replace = lStr.front;

        if (start == end) {
            LString newLStr = new LString();
            return newLStr;
        }
        if (start == end && start == this.length()) {
            LString newLStr = new LString();
            return newLStr;
        */

    }
/*
//append / prepend methods for linked list
    //append
    public void append(int data){
        if (front == null){
            front = new node(data);
            end = front;
        }
        else {
            end.next = new node(data);
            end = end.next;
        }
        length++;
    }

    //prepend
    public void prepend(int data){
        if (front == null){
            end = new node(data);
            front = end;
        }
        else {
            front = new node(data,front);
        }
        length++;
    }
*/
公共类LString{
节点锋;
整数长度;
下一步;
//创建节点类
公共类节点{
字符数据;
节点下一步;
公共节点(char newData){
数据=新数据;
}
公共节点(char newData,node newNext){
数据=新数据;
next=newNext;
}
}
//LString构造函数
//构造表示空字符列表的LString对象
公共电话号码(){
这个长度=0;
this.front=null;
}
//构造原始参数的LString副本
公共LString(原始字符串){
//将第一个字符分配到前面
节点curr=this.front;
this.length=原始的.length();
//循环通过
对于(int i=0;i=长度){
抛出新的IndexOutOfBoundsException();
}
//返回索引处的字符
节点电流=前端;
对于(int i=0;i=长度){
抛出新的IndexOutOfBoundsException();
}
//在索引处替换字符
节点电流=前端;
对于(int i=0;i结束){
抛出新的IndexOutOfBoundsException();
}else if(end>this.length()){
抛出新的IndexOutOfBoundsException();
//特殊情况下返回null(空LString)
}else if(开始==结束){
//&&end==this.length()
返回newLString;
}否则{
node=this.front;
对于(int i=0;ipublic LString replace(int start, int end, LString replacement){
   //Do exception checks for start/end values here

   LString replacedLs = new LString();
   replacedLs.append(substring(0, start));
   replacedLs.append(replacement);
   replacedLs.append(substring(end, this.length));
   return replacedLs;
}
private int insert(LString s, int index ) {
    node 
            n1 = front,
            n2 = null;        
    for (int i = 0; i < index-1; i++) {
        n1 = n1.next;
    }
    n2 = n1.next;
    if (n2 == null) return -1;
    int inserted = 0;
    for (char c : s.toString().toCharArray()) {
        n1.next = new node(c);
        n1 = n1.next;
        inserted++;
    }
    n1.next = n2;
    return inserted;
  }


private int remove(int from, int to) {
    node n1 = front,n2 = null;
    for (int i = 0; i < to+1; i++) {
        if (i<from) {
            n1=n1.next;
        } else if (i==from) n2=n1.next;
        else n2=n2.next;
    }
    n1.next = n2;
    return -1; // or whatever
}

public LString  replace(int start, int end, LString lStr) {
    int inserted = insert(lStr,start);
    int removed = remove(inserted+start-1,inserted+end-1);
    return this;
}