【问题标题】:Linked List, read from text file, and sort by key链表,从文本文件中读取,并按键排序
【发布时间】:2017-06-03 10:44:41
【问题描述】:

我正在尝试通过键(优先级编号,int 编号)从最高到最低对链接列表进行排序,数据来自文本文件。我坚持插入项目并对其进行排序。 这是我的文本文件。

我的工作 66

垃圾 17

有趣的 25

重要 96

重要的 99

更多乐趣 28

工作 69

作业 44

这是我的链表类

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;


@SuppressWarnings("unused")
public class LinkedList {
    Node head;
    Node prev;
    Node cur;
    Node node;

public LinkedList(){

}

public LinkedList(Node head){
    head = null;
}

//getter to get head
public Node gethead(){
    return head;
}

//insert method
public void insert(Data dt){
    try {
        if(head==null){
            head = new Node(dt.getData(), null);
            System.out.println("Opps");
            }
        else if (dt.getData().num > head.dt.num){
            head = new Node(dt.getData(),head);
            System.out.println("Was Here");}
        else if (head.getNext()==null){
            head.setNext(new Node(dt.getData(),null));
            }
        else{
            cur = head.getNext();
            for(prev = head;cur!= null;cur=cur.getNext()){
                if(cur.dt.num>prev.dt.num){
                    Node temp = new Node(dt.getData(),cur);
                    prev.setNext(temp);
                    break;
                }
                else{
                    prev=cur;

                }
            }
        }
    }
        catch (NullPointerException e){
            System.out.println("Here is Error");
        }


}



//Running Linked list
public static void main(String[] args) throws FileNotFoundException{

        LinkedList l1 = new LinkedList();
        Data dt = new Data();

        l1.insert(dt);


}

}

这是我的节点类:

public class Node {
Data dt;
Node next;


public Node(Data dt, Node next){
    this.dt=dt;
    this.next=next;
}


public Node getNext(){
    return next;
}

public void setNext(Node next){
    this.next=next;
}


public Data getData(){
    return dt.getData();
}




}

这是我的数据类:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Data {

protected String name;
protected int num;

public Data(){
}

public Data(String name,int num){
    this.name=name;
    this.num=num;
}

//getter to get Data
@SuppressWarnings("unused")
public Data getData(){
        try{
            int count =0;
            File x = new File("Asg2Data.txt");
            Scanner sc = new Scanner(x);
            while (sc.hasNext()){
                String name = sc.next();
                int num = sc.nextInt();
                Data data= new Data(name,num);
                System.out.println("Name = "+ name+"          "+"Priority = "+num);
                System.out.println(" ");
                count++;
            }
            System.out.println("Total Objects: "+count);
            sc.close();
        }catch(FileNotFoundException e){
            System.out.println("Error");
        }
        return this;
}

//Compare Function
//  public int compare(Data dt){
//      if (this.getData().num > dt.getData().num)
//          return 1;
//      else if (this.getData().num < dt.getData().num)
//          return -1;
//      else
//          return 0;
//  }


// Testing: Worked !!!!!    
    public static void main(String[] args){
        Data d1 = new Data();
        d1.getData();
    }

}

当我从 Linked List 类运行时,我当前的输出:

Name = Myjob          Priority = 66

Name = Junk          Priority = 17

Name = Fun          Priority = 25

Name = Important          Priority = 96

Name = Vital          Priority = 99

Name = MoreFun          Priority = 28

Name = Work          Priority = 69

Name = Assignment          Priority = 44

Total Objects: 8
Opps

我的 insert 方法总是在第一个 if 语句处停止,并且永远不会继续。我不知道如何解决它。同时,它不能执行插入数据+按优先级从高到低排序。谁能帮我 ?我是 Java 的超级新手。非常感谢。

-达斯汀

【问题讨论】:

    标签: java sorting file-io linked-list


    【解决方案1】:

    首先您的 LinkedList 没有被初始化是因为在您的 Data-&gt;getData() 方法中您正在创建数据对象,但从未将它们分配给 LinkedList 头的头部和下一个。

    由于您是 Java 新手,因此只想给您一些使用 Java 编码的技巧。

    • 除非最重要,否则不要使用抑制警告。大多数情况下,您可以处理它们。
    • 尽量隔离代码。这将帮助您和其他所有人理解代码。前任。为什么你的Data类有初始化代码,应该在LinkedList中。数据只是一个表示类,它将充当您的数据的模型(这可能是设计考虑,您可能有理由这样做......只是说)
    • 您还可以浏览一下标识符以及如何使用它们。

    我不会给你完整的代码(因为那样你就没有什么可做的了),但下面的 sn-p 应该让你开始。我已尝试尽可能多地使用您的代码,以便您更容易理解。下面的代码将使用所需的数据初始化一个 LinkedList,也许你可以从那里小心。如果您以后遇到任何问题,您可以继续提出任何问题

    `

     import java.io.File;
     import java.util.Scanner;
    
     public class LinkedList
        {
            Node head;
    
            public static void main(String[] args)
            {
                LinkedList list = new LinkedList();
                list.initializeLL();
                list.printLinkedList();
            }
    
            private void printLinkedList(){
                System.out.println(head);
            }
    
            private void initializeLL()
            {
                Node currentNode = head;
                try
                {
                    File file = new File("Asg2Data.txt");
                    Scanner sc = new Scanner(file);
                    while (sc.hasNext())
                    {
                        Data d = new Data(sc.next(), sc.nextInt());
                        Node n = new Node(d);
                        if(currentNode == null){
                            currentNode = n;
                            head = n;
                        }else{
                            currentNode.setNextNode(n);
                            currentNode = n;
                        }
                    }
                    sc.close();
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
    
        }
    
        class Node
        {
    
            private Data data;
    
            private Node nextNode;
    
            public Node(Data data)
            {
                this.data = data;
            }
    
            public Data getData()
            {
                return data;
            }
    
            public void setData(Data data)
            {
                this.data = data;
            }
    
            public Node getNextNode()
            {
                return nextNode;
            }
    
            public void setNextNode(Node nextNode)
            {
                this.nextNode = nextNode;
            }
    
            @Override
            public String toString()
            {
                return "Node [data=" + data + ", nextNode=" + nextNode + "]";
            }
    
    
    
        }
    
        class Data
        {
    
            private String name;
    
            private int data;
    
            public Data(String name, int data)
            {
                this.name = name;
                this.data = data;
            }
    
            public String getName()
            {
                return name;
            }
    
            public void setName(String name)
            {
                this.name = name;
            }
    
            public int getData()
            {
                return data;
            }
    
            public void setData(int data)
            {
                this.data = data;
            }
    
            @Override
            public String toString()
            {
                return "Data [name=" + name + ", data=" + data + "]";
            }
        }
    

    `

    【讨论】:

    • 你的建议太棒了。我只是修复我的代码。现在效果很好。现在我仍然坚持排序部分。我正在做插入排序。我的代码就在下面
    • 你的建议太棒了。我只是修复我的代码。现在效果很好。现在我仍然坚持排序部分。我正在做插入排序。我的代码就在@utkarsh31下面
    【解决方案2】:

    你的建议太棒了。我只是修复我的代码。现在效果很好。现在我仍然坚持排序部分。我正在做插入排序。这是我的代码。

    public Node insertSort(Node node){
           Node sortedNode = null;
           while(node != null){
            Node current = node;
            node = node.next;
            Node x;
            Node previous = null;
            for(x = sortedNode; x != null; x = x.next){
                if(current.getData().getNum() > x.getData().getNum()){
                        break;
                 }
                 previous = x;
            }
            if(previous == null){               
                  current.next = sortedNode;
                  sortedNode = current;
            }
            else{               
               current.next = previous.next;
               previous.next = current;
            }
          }
          return sortedNode; }
    

    我的输出是

    Name = Myjob            Priority=66
    Name = Assignment            Priority=44
    Name = MoreFun            Priority=28
    Name = Fun            Priority=25
    Name = Junk            Priority=17
    null
    

    他们会跳过大于 66 的任何内容。您有任何想法如何解决此问题,使其可以从 99 下降到 17 吗?我重新排列了文本文件中的顺序,最高的在前。那么就可以完美的进行从99到17的排序了。但是使用原始顺序,我的程序只是执行从 66 到最低的排序。我不知道为什么,以及如何解决它?非常感谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      相关资源
      最近更新 更多