我在我的程序中创建了自己的LinkedList(而不是java.util)。
每张卡片是一个由2个整数组成的对象 - 第一个是卡片中的值(我的代码中为“wartosc”)(从1到13),第二个是我的代码中的颜色(“kolor”)一张卡片(从0到3)。
随机生成列表,并在值为0时创建列表。 现在我必须修改“添加”方法(在我的代码中使用“dodaj”),使其在列表中的正确位置添加卡片。不排序方法添加卡,其余工作正常(显示所有卡),但当我使用应该按顺序添加卡的方法,然后当我尝试打印卡片列表时,它只显示2到5个 - 所有排序除了最后一个。但是,当我打印列表的大小ot显示数字,如20或甚至40,即使我只打印4.所以我想知道什么是错的。这是代码:
public class Lista {
private Element pocz; //start
public int rozmiar;
public Lista() {
boolean zrobione = false;
while (zrobione != true) {
Karta karta = new Karta();
if (karta.getWartosc() == 0) {
zrobione = true;
} else {
this.dodaj(karta);
}
}
}
public void dodaj(Karta k){
if(pocz == null)
pocz = new Element(k);
Element pom = new Element(k);
Element obecny = pocz;
boolean zrobione = false;
if(obecny != null && !zrobione){
while(obecny.getNext() !=null && (obecny.getNext().getKarta().wartosc > obecny.getKarta().wartosc || (obecny.getNext().getKarta().wartosc == obecny.getKarta().wartosc && obecny.getNext().getKarta().kolor > obecny.getKarta().kolor))){
obecny = obecny.getNext();
}
obecny.setNext(pom);
zrobione = true;
}
rozmiar++;
}
// public void dodaj(Karta k) {
// if (pocz == null) {
// pocz = new Element(k);
// }
//
// Element pom = new Element(k);
// Element obecny = pocz;
// if (obecny != null) {
// while (obecny.getNext() != null) {
// obecny = obecny.getNext();
// }
// obecny.setNext(pom);
// }
// rozmiar++;
// }
public int getRozmiar(){
return rozmiar;
}
public void drukujOKolorze(int kolor){
if(kolor<0 || kolor>4)
System.out.println("Bledny kolor");
else{
Element obecny = null;
if(pocz != null){
obecny = pocz.getNext();
while(obecny.getNext() != null){
if(obecny.getKarta().kolor == kolor)
System.out.println(obecny.getKarta().toString());
obecny = obecny.getNext();
}
}
}
}
public void drukujOWartosci(int wartosc){
if(wartosc<0 || wartosc>13)
System.out.println("Bledna wartosc");
else{
Element obecny = null;
if(pocz != null){
obecny = pocz.getNext();
while(obecny.getNext() != null){
if(obecny.getKarta().wartosc == wartosc)
System.out.println(obecny.getKarta().toString());
obecny = obecny.getNext();
}
}
}
}
public void wyswietl(){
if(pocz != null){
Element obecny = pocz.getNext();
while(obecny != null) {
System.out.println(obecny.getKarta().toString());
obecny = obecny.getNext();
}
}
}
}
很抱歉没有使用英文名字 - 我会在下面写一个简短的词典:)
Lista()是List的构造函数,它检查生成的值是否为0,然后使用“dodaj”方法
“dodaj”方法是“添加”第一个应该排序的卡
我现在发表评论的第二个“dodaj”是刚刚添加新内容的第一个 牌。它们没有排序,但是当我使用它时,下一个方法按预期工作。
getRozmiar()返回List的大小,“rozmiar”表示“size”
“drukujOKolorze”和“drukujOWartosci”分别打印: 给定颜色的卡片和给定值的卡片 - 它们工作正常。
最后是“wyswietl”,即“print”。当我使用第二个“dodaj”时,它会打印列表中的所有卡片。当我使用第一个“dodaj”时,它只显示2到5张牌,最后一张从未排序,而“getSize()”表示列表中有更多牌。
我希望你们能帮助我。我不知道这里出了什么问题,不,我不能使用compareTo。我的任务是编写将卡片整理好的方法。
答案 0 :(得分:1)
当您找到要放置卡片的位置时,您将其设置为链接列表中的下一个项目,但不会在新条目后重新附加列表的其余部分,从而有效地删除所有卡片后插入点。
想象一下它是一个真正的金属链接链。 您打开中间的一个链接,将链条分成两部分,然后将新链接添加到一侧。但是,您没有将链的另一半连接到新链接,因此它会丢失。
试试这个:
public void dodaj(Karta k){
if(pocz == null)
pocz = new Element(k);
Element pom = new Element(k);
Element obecny = pocz;
boolean zrobione = false;
if(obecny != null && !zrobione){
while(obecny.getNext() !=null && (obecny.getNext().getKarta().wartosc > pom.getKarta().wartosc || (obecny.getNext().getKarta().wartosc == pom.getKarta().wartosc && obecny.getNext().getKarta().kolor > pom.getKarta().kolor))){ // Modified line
obecny = obecny.getNext();
}
pom.setNext(obecny.getNext()); // Added line
obecny.setNext(pom);
zrobione = true;
}
rozmiar++;
}