Java 如何对带有对象和私有变量的链表进行排序
在这里我要坦诚相待。这是家庭作业,但我已经绝望了,我正在寻找任何人来帮助我。我已经断断续续地做了一个多月了,并且多次去找我的导师。基本上,这个程序需要创建一个链表并对其排序,该链表在每个节点中都有int、string和double。它需要能够按每个数据类型进行排序,以及按输入顺序打印,但一旦我找到一个,我就可以将其传输到其他数据类型。请,一切都需要“手工制作”,请不要使用任何内置命令,因为我需要根据我的导师的要求创建一切 我试图创建链表,然后对其进行排序,但遇到了一个问题,所以我决定在创建链表时尝试对其进行排序 例如:输入第一个节点,然后在第一个节点的前面/后面输入下一个节点,然后将下一个节点放在它需要去的地方。。。等等 以下是我的代码(我只关注字符串):Java 如何对带有对象和私有变量的链表进行排序,java,sorting,linked-list,private,setter,Java,Sorting,Linked List,Private,Setter,在这里我要坦诚相待。这是家庭作业,但我已经绝望了,我正在寻找任何人来帮助我。我已经断断续续地做了一个多月了,并且多次去找我的导师。基本上,这个程序需要创建一个链表并对其排序,该链表在每个节点中都有int、string和double。它需要能够按每个数据类型进行排序,以及按输入顺序打印,但一旦我找到一个,我就可以将其传输到其他数据类型。请,一切都需要“手工制作”,请不要使用任何内置命令,因为我需要根据我的导师的要求创建一切 我试图创建链表,然后对其进行排序,但遇到了一个问题,所以我决定在创建链表时
复制的目的是什么?您正在尝试创建列表节点的副本吗?如果是,那么像
copy=fChr
和copy=NextNode
这样的语句就不会执行。这些导致copy
指向与fChr
或NextNode
相同的节点。然后,当您说copy.next=fStr
时,它还将设置fChr.next=fStr
或NextNode.next=fStr
,这取决于copy
分配给的是什么,因为copy
是对同一节点的引用。如果您确实想用相同的字段进行复制,请尝试copy=newlist1()代码>,将创建一个新节点;我想你已经在设置字段了。@ajb好的,谢谢,你说得对,我正试图复制一个列表节点。唯一的问题是,我在对象中有“输入字符串、double和int”的问题。copy=new list1()将再次询问这些问题,对吗?我想复制NextNode而不创建对象的新实例(问题)。不管怎样,我是可以做到这一点,还是我必须完全重新编写程序?哎呀,我没看到。那真的不是放置这些输入语句的好地方。建议:在list1
类中添加一个static
方法,public static list1 createListNodeFromInput()
,该方法创建一个新节点,然后向用户询问问题并设置字段。然后,程序的其余部分在希望从用户数据创建新节点时使用node=list1.createListNodeFromInput()
,在仅希望创建新节点时使用node=new list1()
,以准备制作另一个节点(例如)的副本。如果我有很多时间和你坐下来,我会建议对你的代码进行更多的重组。但这是一个相当简单的修复,您可以在不破坏整个程序的情况下进行。希望能有帮助。谢谢,我会尽力去做,看看能不能让它发挥作用。问题是我的老师讨厌静态变量,我不确定这是否是同一件事。如果是这样的话,我可能不得不尝试另一种方式,或者只是希望他不要太在意。我的老师很守旧,说在大学里他们不会在乎,但他希望我们理解一切,没有捷径,我想这是值得尊敬的。
String repeat = "y";
list1 fChr = null;
list1 p = fChr;
list1 copy = null;
//list1 dCopy = null;
//list1 iCopy = null;
list1 fd = fChr;//front of the double list
list1 fi = fChr;//front of the integer list
list1 fStr = fChr;//front of the string list~
list1 pStr = fStr;
boolean inserted = false;
int iii = 0;
String sss = "";
double ddd = 0.0;
while(repeat.equals("y"))//while the user agrees to adding a new node
{
if(fChr == null)// if the front is empty
{
fChr = new list1();//create a new node by calling object and sets it as the front
p = fChr;
copy = fChr;
sss = fChr.GetS();
iii = fChr.GetI();
ddd = fChr.GetD();
copy.SetS(sss);
copy.SetI(iii);
copy.SetD(ddd);
System.out.println("(1)");
}
else
{
System.out.println("(2)");
if(p!=null)
{
System.out.println("p = "+ p.GetS());
if(p.next != null)
{
System.out.println("p.next = "+ p.next.GetS());
System.out.println("p.next.next = "+ p.next.next.GetS());
}
}
p = fChr;
while(p.next != null)//finds the end of the Linked list
{
System.out.println("(3)");
p = p.next;//moves the pointer p down the list
}
list1 NextNode = new list1();//
p.next = NextNode;
sss = NextNode.GetS();
iii = NextNode.GetI();
ddd = NextNode.GetD();
copy = NextNode;
String gg = "hi";//tests to see if the setter is actually changing the value inside copy(it is not, it prints b)
copy.SetS(gg);
copy.SetI(iii);
copy.SetD(ddd);
System.out.println(copy.GetS());
System.out.println("p = "+ p.GetS());
}
pStr = fStr;
//System.out.println(copy.GetS()+"*");
inserted = false;
if(fStr == null)
{
System.out.println("(4)");
fStr = copy;//fStr = fChr;
inserted = true;
//System.out.println("p.next.next = "+ p.next.next.GetS());
}
else if(copy.GetS().compareTo(fStr.GetS()) < 0)
{
System.out.println("(5)");
//System.out.println("1)p.next.next = "+ p.next.next.GetS());
copy.next = fStr;//ERROR ON THIS LINE
System.out.println("2)p.next.next = "+ p.next.next.GetS());
System.out.println("fChr.next: "+fChr.next.GetS());
fStr = copy;
System.out.println("3)p.next.next = "+ p.next.next.GetS());
inserted = true;
System.out.println("p = "+ p.GetS());
System.out.println("p.next = "+ p.next.GetS());
System.out.println("4)p.next.next = "+ p.next.next.GetS());
}
else if(fStr.next == null && fStr != null)
{
System.out.println("(6)");
fStr.next = copy;
inserted = true;
}
else
{
System.out.println("(7)");
pStr = fStr;
System.out.println("RIP (8)");
while(pStr.next != null && inserted == false)
{
System.out.println("(9)");
System.out.println("RIP");
if(copy.GetS().compareTo(pStr.next.GetS()) < 0)//if it goes between 2 nodes
{
System.out.println("(10)");
copy.next = pStr.next;
pStr.next = copy;
inserted = true;
}
else
{
System.out.println("(11)");
pStr = pStr.next;
}
if(pStr.next == null && inserted == false)// it goes at the end(not necessary bc of the (in order) part)
{
System.out.println("(12)");
pStr.next = copy;
}
}
}
repeat = JOptionPane.showInputDialog("Would you like to add a node [y/n]");
System.out.println("End of Loop");
}
System.out.println(fStr.GetS());
PrintMenu(fChr, fi, fd, fStr);// sends the user to the menu screen
}
import javax.swing.JOptionPane;
public class list1
{
private int i;
private String s;
private double d;
private String ss = null;
private int ii = 0;
private double dd = 0.0;
list1 next = null;
public list1()
{
String str;
s=JOptionPane.showInputDialog("Enter a String");
String temp =JOptionPane.showInputDialog("Enter an Integer");
i = Integer.parseInt(temp);
String temp2 =JOptionPane.showInputDialog("Enter a Double");
d = Double.parseDouble(temp2);
}
public double GetD()
{
return d;
}
public String GetS()
{
return s;
}
public int GetI()
{
return i;
}
public void SetS(String x)
{
ss = x;
}
public void SetI(int y)
{
ii = y;
}
public void SetD(double z)
{
dd = z;
}
}