我尝试使用来自文本文件的数据按键(优先级编号,int编号)从最高到最低排序链接列表。我正忙着插入物品并对它们进行分类。 这是我的文本文件。
Myjob 66
Junk 17
Fun 25
重要96
重要99
MoreFun 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的超级新人。非常感谢你。
-Dustin
答案 0 :(得分:0)
首先,您的LinkedList未初始化是因为在您的Data->getData()
方法中,您正在创建数据对象,但从未将它们分配给头部和下一个LinkedList头。
由于您不熟悉Java,因此只想给您一些使用Java编写代码的技巧。
我不会给你完整的代码(因为那时你没有任何东西可以做)但下面的代码片段应该让你开始。我尽可能地尝试使用您的代码,以便您更容易理解。下面的代码将使用所需的数据初始化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 + "]";
}
}
`
答案 1 :(得分:0)
你的建议太棒了。我只修复了我的代码。它现在运作良好。现在我仍然坚持排序部分。我在做插入排序。这是我的代码。
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到最低的排序。我不知道为什么,以及如何解决它?非常感谢。