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_Mergesort - Fatal编程技术网

Java链表中字符串的合并排序

Java链表中字符串的合并排序,java,string,linked-list,mergesort,Java,String,Linked List,Mergesort,我有一个练习,我必须在链表中插入一个字符串。假设字符串如下所示: "Java Coding Is Great" great >> is >> java >> coding 合并排序后,链表应如下所示: coding >>> great >>> is >>> java. 问题在于,在我的合并排序代码中,我接收到以下内容: "Java Coding Is Great" great >>

我有一个练习,我必须在链表中插入一个字符串。假设字符串如下所示:

"Java Coding Is Great"
 great >> is >> java >> coding 
合并排序后,链表应如下所示:

coding >>> great >>> is >>> java.
问题在于,在我的合并排序代码中,我接收到以下内容:

"Java Coding Is Great"
 great >> is >> java >> coding 
所有单词都已排序,但第一个单词(原始列表的标题)未排序

我有两个类:TextList和WordNode

WordNode类有两个属性:

String _word; WordNode _next; //an address to the next link
TextList类只有一个属性:链接列表头的地址:

WordNode _head;
我有一个构造函数,在其中我将字符串随机插入到一个链表中。最后,它开始合并列表。此算法适用于此练习

public TextList(String text){
     String s=""; int index=text.length();
    //we will stop at the end of the String.
    for (int i=text.length()-1; i>=0; i--){
        //if we reached a space, insert each string in appropriate order, 
        //the first word is the head of the string and last word points to null.
        if (!(text.charAt(i)>='a' && text.charAt(i)<='z')){ 
            s=text.substring(i,index);
            _head=new WordNode(s,_head);
            s="";
            index=i;
        }
        if (i==1){
            s=text.substring(i-1,index);
            _head=new WordNode(s,_head);
        }
    }

//start merge sotring the list.
    this._head=this._head.mergeSort();
}
合并方法

private WordNode merge(WordNode h){
        //method merges this's list with h's list

        //if h is null, just return this.
        if (h==null){
            return this;
        }
        if (this._word.compareTo(h._word)<0){
            if (this._next==null)
                return new WordNode(this._word,h);
            else
                return new WordNode(this._word,this._next.merge(h));
        }
        else
            return new WordNode (h._word, merge(h._next));

    }

请帮我弄清楚出了什么问题很遗憾,我不能使用第三个类,,也不能使用指向列表开头或结尾的指针。

您可以使用调试器单步执行代码吗?这将帮助你找出问题所在。即使是几个放置得当的断点也会有所帮助

从一个只包含一个条目的列表开始:“Java”。看看会发生什么

然后尝试两项列表:“Java编码”。看看在这种情况下会发生什么


找出简单案例中发生的情况,然后再研究更复杂的案例。

这里的问题有点滑稽

在我的构造器中,我在列表中插入的每个单词都有一个空格

我通过这个代码修正了:

            s=text.substring(i+1,index);
而不是:

            s=text.substring(i,index);

答案要归功于DevForum的NormR。

不错,但我不喜欢您在WordNode中使用merge()的解决方案。一方面,您可以比较喜欢的每个节点,如下所示:

this._word.compareTo(h._word);
但是在这种情况下,merge()和split()都是私有的,所以我认为更好的方法是将它们放入TextList和mergeSort()中,而不重载。无论何时添加节点,都需要对链表中的所有节点进行排序,而不仅仅是其中的一部分。这就是为什么

this._head = this._head.mergeSort();
还有这个

public WordNode mergeSort(){
    return mergeSort(this);
}
在WordNode中看起来没用。
另一方面,如果您将mergeSort调用放入如下文本列表中

this._head = this.mergeSort(this._head);
int counter = 1;    //  nodes counter helps to know if the current node is odd or even
WordNode L = null,  //  odd nodes
         R = null;  //  even nodes
while(h != null)
{
    if(counter%2 == 0)
        R = new WordNode(h.getWord(), R, h.getWordCounter());
    else
        L = new WordNode(h.getWord(), L, h.getWordCounter());
    //  
    h = h.getNext();
    counter++;
}
并将排序合并到文本列表中的这个

 public WordNode mergeSort(WordNode n){

 }
这已经很好了,但你可以通过减少更多的时间和空间竞争来做得更好,你可以将你的列表分成这样的赔率和均数

this._head = this.mergeSort(this._head);
int counter = 1;    //  nodes counter helps to know if the current node is odd or even
WordNode L = null,  //  odd nodes
         R = null;  //  even nodes
while(h != null)
{
    if(counter%2 == 0)
        R = new WordNode(h.getWord(), R, h.getWordCounter());
    else
        L = new WordNode(h.getWord(), L, h.getWordCounter());
    //  
    h = h.getNext();
    counter++;
}
当你把它放在一起,你会得到这样的东西(别忘了单词计数器)

现在剩下的就是像这样完成merge(),再次不要忘记单词counter

public WordNode mergeSort(WordNode h){
    int counter = 1;    //  nodes counter helps to know if the current node is odd or even
    WordNode L = null,  //  odd nodes
             R = null;  //  even nodes
    while(h != null)
    {
        if(counter%2 == 0)
            R = new WordNode(h.getWord(), R, h.getWordCounter());
        else
            L = new WordNode(h.getWord(), L, h.getWordCounter());
        //  
        h = h.getNext();
        counter++;
    }
    return merge(mergeSort(L), (mergeSort(R)));
}
private WordNode merge(WordNode L, WordNode R)
{   
    while(L != null || R != null)
    {
        if(L != null && R != null)
            if(L.getWord().compareTo(R.getWord()) <= 0)
                return new WordNode(L.getWord(), merge(L.getNext(), R), L.getWordCounter());
            else
                return new WordNode(R.getWord(), merge(L, R.getNext()), R.getWordCounter());
        else if(L != null)
            return new WordNode(L.getWord(), merge(L.getNext(), R), L.getWordCounter());
        else if(R != null)
            return new WordNode(R.getWord(), merge(L, R.getNext()), R.getWordCounter());
    }
    return null;
}
私有WordNode合并(WordNode L,WordNode R)
{   
而(L!=null | | R!=null)
{
如果(L!=null&&R!=null)

if(L.getWord().compareTo(R.getWord())对同一个问题发布更多次不会帮助您找到答案。请删除其中一个,然后等待答案。@反斜杠-我在这里取得了真正的进步,因为代码几乎可以正常工作。感谢您的关注-我如何删除我以前的问题?不要删除它。请删除此问题,并用所有新的deta更新旧问题ils。@反斜杠,这没有任何意义。他为什么要删除这个新问题,因为这个问题实际被回答的概率要高得多。这可能只是一个拼写错误,但你有:
This.\u head=This.\u head.mergeSort();
,但是你的
mergeSort
方法需要一个
WordNode
。现在尝试了一下……到目前为止还没有成功找到答案。可能还有其他想法吗?粗糙的解决方案,它没有找到问题的根源。在列表的开头添加一个虚假条目:“aaaaaaaaaaa”,排序,然后删除假条目。@Alan你怎么能在使用调试器时找不到任何东西?你是否尝试过使用它,并意识到你现在不知道如何使用它?不想表现得粗鲁,但它一定帮助你找到了一些东西…@Steve P。也许问题出在头上-它一直回到链接列表的末尾r合并,我就是不明白为什么。@rossum-这可能行得通,但我必须仔细查看所有列表,对吗?我认为这可能行得通,但正如你所建议的那样-不会找到问题的根源。