Java链表:如何向图片中添加像素

3
我有一个问题,要在LinkedList中添加一个“Pixel”。
有一个黑白图片的类(名为"Bild"),当您创建图片对象时,必须说明图片的高度和宽度。通过宽度,您还要说图片对象中像素数组的大小。因此,图片的宽度与数组的长度一样!
在数组的每个元素中,应将图像的列作为一个"Pixel"的链接列表。但是,在链表中仅保存了黑色像素!每个“Pixel”都有一个表示其在图片中所在行的int值。不保存白色像素!
已完成的方法:
- public Pixel pixelAt(int zeile, int spalte):此方法返回“Picture”中行/列中的一个黑色“Pixel”。如果没有黑色“Pixel”,则返回null。 - public void printBild():为黑色像素打印"*",为白色像素打印"-"。
未完成的方法:
- public void pixelOn(int zeile, int spalte)
此方法应检查该行/列是否存在黑色像素。在此处可以使用pixelAt()方法。白色像素应更改为黑色像素,因此添加到链接列表中。如果像素已经是黑色,则不会发生任何事情。
之后我再次调用printBild(),白色像素“_”仍然是白色的而不是黑色的“*”。
public class Pixel { 

private int zeile; 
private Pixel next; 

public Pixel ( int zeile, Pixel p ) {
    this.zeile = zeile;
    this.next = p;
}

public int getZeile() {
    return zeile;
}

public Pixel getNext() {
    return next;
}

// Setze Verweis auf nächsten schwarzen Pixel 
public void setNext( Pixel p) {
    next = p;
}

}


public class Bild {

private Pixel [] data;
private int hoehe, breite;  

public Bild (int hoehe, int breite) {
    this.data = new Pixel [breite];

    this.hoehe = hoehe;
    this.breite = breite;
}

public void setData(Pixel [] temp) {
        this.data = temp;   
}

public Pixel pixelAt(int zeile, int spalte) { 

    Pixel iterator = data[spalte];
    if(iterator.getZeile() == zeile) {
        return iterator;
    }
    else {
        while (iterator.getNext() != null) {
            iterator = iterator.getNext();

            if(iterator.getZeile() == zeile) {
                return iterator;
            }
        }
    }
    return null;
}


public void printBild() { 

    String leer = "";
    String [] hi = new String [hoehe];

    for (int k = 0; k < hoehe; k++) {
        hi[k] = leer;
    }

    for (int i = 0; i < data.length; i++) {

        Pixel iterator = data[i];

        for (int j = 0; j < hoehe ; j++) {

            if (iterator == null) {
                hi[j] += " - ";
            }

            else {

            if (iterator.getZeile() == j) {
                hi[j] += " * ";
                iterator = iterator.getNext();
            }
            else {
                hi[j] += " - ";
            }
        }
        }
    }

    for (int q = 0; q < hi.length; q++) {
        System.out.println(hi[q]);
    }


}

public void pixelOn(int zeile, int spalte) {



    if (pixelAt(zeile, spalte) == null) {
        Pixel it = data[spalte];

        for (int i = 1; i < zeile; i++) {   
            it = it.getNext();
        }

        Pixel tmp = it.getNext();
        Pixel neu = new Pixel(zeile, null);
        it.setNext(neu);
        neu.setNext(tmp);
    }   
}
}




public class TestBild {

public static void main(String[] args) {


Pixel a1 = new Pixel(2, null);


Pixel b1 = new Pixel(0, null);

Pixel b2 = new Pixel(1,null);
b1.setNext(b2);

Pixel b3 = new Pixel (3, null);
b2.setNext(b3);


Pixel c1 = new Pixel(1, null);

Pixel c2 = new Pixel(2,null);
c1.setNext(c2);


Pixel [] temp = new Pixel [3];

temp[0] = a1;
temp[1] = b1;
temp[2] = c1;


Bild BW = new Bild(4,3);
BW.setData(temp);


BW.printBild();
BW.pixelOn(2, 0);
System.out.println();
BW.printBild();


}



}

...

Thank you!


1
你没有一个链表,而是一个数组。数组是不可变的,你必须使用一个列表(比如ArrayList)。 - Toilal
谢谢@Toilal!但是每个数组元素中都有链接列表吗?我不想改变数组的长度,只想改变数组字段中的LinkedLists。 - Kristin Porthcot
1个回答

2

首先,你的pixelOn比你写的要复杂。它应该是这样的:

public void pixelOn(int zeile, int spalte) {
    if (pixelAt(zeile, spalte) == null) {
        Pixel neu = new Pixel(zeile, null);
        Pixel it = data[spalte];
        if(it!=null){
            if(it.getZeile()<zeile){
                Pixel tmp=it.getNext();
                while(tmp!=null && tmp.getZeile()<zeile){
                    it = tmp;
                    tmp = it.getNext();
                }
                it.setNext(neu);
                neu.setNext(tmp);
            }else{
                neu.setNext(it);
                data[spalte] = neu;
            }
        }else{
            //there is nothing in the column for now add it
            data[spalte] = neu;
        }
    }
}

其次,您的测试未在空白位置插入。 (2, 0) 是第2行和第0列。那里的元素是黑色的。


1
非常感谢!我明白了!现在我看到我之前想得有多复杂。 - Kristin Porthcot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接