我的LinkedList在排序后没有显示出corectly

时间:2017-03-27 19:16:30

标签: java

我在我的程序中创建了自己的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。我的任务是编写将卡片整理好的方法。

1 个答案:

答案 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++;
}