当前位置: 首页 > 知识库问答 >
问题:

链表,从文本文件中读取,按键排序

陶永望
2023-03-14

我正在尝试排序的键(优先数,int数)从最高到最低的链表,与数据从文本文件。我正在埋头插入项目并对它们进行排序。这是我的文本文件。

我的工作66

垃圾17

资金25

重要96

生命99

Moreutn 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();
    }

}

从链表类运行时的当前输出:

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。太感谢你了。

--达斯汀

共有2个答案

欧阳安晏
2023-03-14

你的建议太棒了。我只是修改我的代码。而且现在效果很好。现在我还在忙着整理部分。我在做插入排序。这是我的代码。

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到最低的排序。我不知道为什么,怎么修?太感谢你了。

司空和悌
2023-03-14

首先,LinkedList没有初始化是因为在data->getData()方法中创建了数据对象,但从未将它们分配给LinkedList head的head和next。

因为你是Java的新手,所以我想给你一些关于用Java编码的技巧。

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

我不会给您完整的代码(因为这样您就没有什么可做的了),但是下面的代码片段应该可以让您开始。我已经尝试尽可能多地使用您的代码,以便您更容易理解。下面的代码将用所需的数据初始化一个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 + "]";
        }
    }

`

 类似资料:
  • null > 构造函数,它接受两个输入:(String,String)。这两个输入以正确的顺序表示lastname和firstname。构造函数只需将参数中的数据分配给实例变量。 名为toString()的公共实例方法,它返回一个字符串数据(学生的姓名),格式为“lastname,firstname”。 类MainApp null

  • 代码: 我正在尝试从通过Read_file按钮读取的文本文件填充jlist 我能够正确获取文件路径和文件内容,我用print语句验证了这些文件,但我的jlist仍然是空的。在设计中,我检查了jlist的变量名,两者都与我在代码中使用的匹配。

  • 问题内容: 我想读取不同块的日志文件,以使其成为多线程。该应用程序将在具有多个硬盘的服务器端环境中运行。读取成块后,应用程序将处理每个块的每一行。 我已经用bufferedreader完成了对每个文件行的读取,并且可以通过将RandomAccessFile与MappedByteBuffer结合使用来制作文件块,但是将这两者结合起来并不容易。 问题在于该块正好切入我块的最后一行。我从来没有块的最后一

  • 我正在编写一个程序,读取文本文件,并显示第一个学生的姓名、年级和全班平均成绩。对于上面给出的文件,结果如下:类中的第一个是Ahmad Hamwi has 16.00,类的平均值是12.25这是我试图读取的W文本文件 这就是我一直犯的错误 我已经试了几个小时了。我知道错误在第37行。这可能与类型有关。我尝试了int和浮动,但一样。

  • 我有一个java代码,我在其中读取了一个txt文件,然后迭代它,以便我可以将其填充到2d数组中。在我读取文件后,我能够打印出其内容,因此我确信该文件已被读取。并且我还确信bufferedreader库的. hasNextLine方法在找到一行时显示为true。但是当我在time循环中使用它时,它就像没有找到任何行一样,因此它没有迭代,因为我不知道我在表中有多少行。== 此外,当我硬编码行数以便检查