当前位置: 首页 > 知识库问答 >
问题:

填充自定义对象的数组 将另一个对象的字段修改到数组中

司空赞
2023-03-14

我创建了一个名为MipMapData的类来保存有关mipmap的信息,它保存维度、数据大小和图像格式。从代码的另一部分,我创建了一个MipMapData对象数组,问题是每次我向数组中添加一个新的MipMapData对象时,数组中所有的mimpamp信息对象都会修改它们的维度字段,当我填充所有数组时,结果是所有对象在其维度字段中的值与添加到数组中的最后一个值相同。我在维度字段上做错了什么?

    import java.awt.Dimension;
import com.jme3.texture.Image;
import com.jme3.texture.Image.Format;


public class MipMapData {
    private Dimension dimension;
    private Long dataSize;
    private Image.Format format;

//Constructor calculates size. Has this arguments to avoid the existence of mipmap incomplete data or with errors in datasize
public MipMapData(Image.Format format, Dimension dimension){
    this.format=format;
    setDimension(dimension);
}



public Dimension getDimension() {
    return dimension;
}
public void setDimension(Dimension dimension) {
    this.dimension = dimension;


    if(format==Format.DXT5||format==Format.DXT3){
        this.dataSize=(long) (dimension.height*dimension.width);
        if(this.dataSize<16)
            this.dataSize=(long) 16;
        return;
    }
    else if(format==Format.DXT1){
        this.dataSize=(long)((dimension.height*dimension.width)/2);
        if(this.dataSize<8)
            this.dataSize=(long) 8;
        return;
    }
    else if(format==Format.ABGR8){
        this.dataSize=(long)(dimension.height*dimension.width*4);
        return;
    }
    else if(format==Format.Luminance8||format==Format.Depth){
        this.dataSize=(long)(dimension.height*dimension.width);
        return;
    }
}




public Long getDataSize() {
    return dataSize;
}


//The datasize of each mipmap is automatically calculated in the constructor
static MipMapData[] createMipMapDataArray(Dimension textureDimensions, int numberOfMipMaps, Image.Format imageFormat){
    int width=textureDimensions.width;
    int height=textureDimensions.height;
    Dimension mipMapDimension= new Dimension();
    MipMapData[] mipMapDataArray= new MipMapData[11];

    if(imageFormat==Format.DXT5|| imageFormat==Format.DXT3){
        for(int i=0;i<=10;i++){
            if((width)<1)
                width=1;
            if((height)<1)
                height=1;
            mipMapDimension.height=height;
            mipMapDimension.width=width;
            mipMapDataArray[i]= new MipMapData(imageFormat,mipMapDimension);
            //actualize dimensions for next mipmap
            width/=2;
            height/=2;
        }
    }
    else if(imageFormat==Format.DXT1){
        for(int i=0;i<=10;i++){
            if((width)<1)
                width=1;
            if((height)<1)
                height=1;
            mipMapDimension.height=height;
            mipMapDimension.width=width;
            mipMapDataArray[i]= new MipMapData(imageFormat,mipMapDimension);
            //actualize dimensions for next mipmap
            width/=2;
            height/=2;

        }
    }
    else if(imageFormat==Format.ABGR8||imageFormat==Format.Luminance8||imageFormat==Format.Depth){
        for(int i=0; i<=10;i++){
            if((width)<1)
                width=1;
            if((height)<1)
                height=1;
            mipMapDimension.height=height;
            mipMapDimension.width=width;
            mipMapDataArray[i]= new MipMapData(imageFormat,mipMapDimension);
            //actualize dimensions for next mipmap
            width/=2;
            height/=2;

        }
    }
    return mipMapDataArray;
}

}

共有2个答案

柳逸春
2023-03-14

您正在循环外部创建一个维对象,并将其分配给所有MipMapData对象

Dimension mipMapDimension= new Dimension();

记住,在Java中,对象是通过引用传递的。因此,当您将mipMapDimension传递给MipMapData构造函数时,它将在所有构造函数中被引用。

殳毅
2023-03-14

当您调用createMinMapDataArray()时,所有字段都设置为相同的原因是因为您检查某些条件,例如

如果(图像格式==Format.DXT5||图像格式==Format.DXT3)

然后,您遍历数组并使用每个索引相同的新MinMap()对象初始化索引。

添加到数组的概念并不是考虑数组的正确方法。数组用于存储通常具有预定大小的信息。要将对象添加到第 i 个索引,您需要执行以下操作:

MipMapData[] minMaps = createMipMapDataArray(// pass your parameters here)
minMaps[10] = new MinMap(// pass your parameters)

当然,这不会将值添加到数组中。它用新值覆盖/替换minMaps[10]的值。

要将不确定数量的 MinMaps 添加到列表中,请考虑使用 ArrayList

ArrayList<MinMap> minMapList = new ArrayList<MinMap>();
minMapList.add(new MinMap(// pass your parameters here));

 类似资料:
  • 我在创建包含自定义对象数组的数组时遇到了问题。 出于多种原因,我希望将容器创建为可比较数组的标准数组: 其中包含的每个自定义对象数组必须具有不同的长度 自定义对象数组内置了自动排序工具,这些工具不适合我希望它们适合的较大包含数组 自定义对象数组可以工作,并且已经过彻底测试。 我在创建较大对象时收到的例外情况是: 线程“main”中出现异常java.lang.ClassCastException:

  • 问题内容: 我是Java的初学者,正在尝试创建自定义类的数组。假设我有一个名为car的类,并且我想创建一组称为Garage的汽车。如何将每辆车添加到车库?这就是我得到的: 问题答案: 如果要使用数组,则必须保留一个包含车库中汽车数量的计数器。最好使用而不是数组:

  • 我是android编程的新手,我试图将自定义对象数组发送到不同的活动中。在第一个活动中,我有一个函数,它创建一个意图并向其中添加对象数组:

  • 问题内容: 我有两个对象数组。我想基于PermissionObj过滤数据。 这是即将形成的数据库。这是permissionObj中的子数组的数组。 这是静态数据。我想比较基于PermissionObj的数据。 我正在尝试基于 对象 的 PermissionObj数组 过滤 对象 的 数据数组 。这是我尝试的代码。 如果PermissionObj值将与data值匹配。然后显示数据。 我接受的输出将是

  • 假设我有以下内容 这会产生如下所示的数组 我可以做一个级别,但是多个杠杆怎么样?我的伪代码类似于 但是对于无限的势能级,我该怎么做呢?

  • 很抱歉这太模糊了,但代码太多了。 这是一个五卡梭哈游戏。基本上,我试图将对象添加到另一个数组列表中的数组列表中。 这是我创建玩家数组并将手类中的数组添加到其中的地方,至少我认为这就是正在发生的事情: 稍后,我尝试在循环交易中将牌添加到玩家阵列中的手牌阵列中。由于有五张牌,第一个循环进行了五次。第二个是玩家数组的长度(玩家总数),每次应该添加一张卡。 Deck类中有一个deal方法,由以下方法初始化