0

我被困在试图管理列表列表的列表中。我已经声明并初始化了我的数据结构:

List<Vector<ArrayDeque<Vector_t>>> mData = new ArrayList<Vector<ArrayDeque<Vector_t>>>(
        6);

for (int i = 0; i < 6; ++i) {
    mData.add(i, new Vector<ArrayDeque<Vector_t>>());
    // mData.get(i).setSize(200);
}

for (int i = 0; i < 6; i++) {
    for (int k = 0; k < 200; k++) {
        mData.get(i).add(new ArrayDeque<Vector_t>());
        mData.get(i).get(k).add(new Vector_t());
    }
}

其中 Vector_t 是:

class Vector_t {
    float x;
    float y;
    float z;
}

这个初始化正确吗?在最后一个位置向数组 deque 添加值时,它会用最后一个元素替换整个 arraydeque,我不知道为什么。

此外,当我使用代码更改值时mdata.get(1).get(42),元素所在的mdata.get(0).get(40)位置也会受到影响。再说一次,我不知道为什么?

例如,我给出了硬编码的值。这是我添加的方式

if (mData.get(dir.value).get(slice).size() >= sMaxNum_c)
     {
                 mData.get(dir.value).get(slice).removeFirst();
     }
              mData.get(dir.value).get(slice).addLast(result.acc);

当向一个方向添加值时,其他方向值正在改变......:(

请帮我解决这个问题。

4

2 回答 2

0

我不确定你想要实现什么,但对于初学者来说,你应该考虑使用除 Vector 之外的另一种数据结构,因为它已经过时了。

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
// Consider using another DataStructure such as Arraylist, as Vector<> is obsolete.
import java.util.Vector;

public class main {

    public static void main(String[] args) {

        // Use diamond inference.
        List<Vector<ArrayDeque<Vector_t>>> mData = new ArrayList<>(6);

            for (int i = 0; i < 6; i++) {
                Vector<ArrayDeque<Vector_t>> vav = new Vector<>();
                ArrayDeque<Vector_t> av = new ArrayDeque<>();

                for (int k = 0; k < 200; k++) {
                    av.add(new Vector_t(2.0f, 2.0f, 2.0f));
                }

                vav.add(av);
            }
        }
    }

使用变量而不是调用 get() 这么多。

public class Vector_t {
private float x;
private float y;
private float z;

public Vector_t() {
    x = 0.0f;
    y = 0.0f;
    z = 0.0f;
}

public Vector_t(float x, float y, float z) {
    this.x = x;
    this.y = y;
    this.z = z;
}

public float GetX() {
    return x;
}

public float GetY() {
    return y;
}

public float GetZ() {
    return z;
}

public void SetX(float x) {
    this.x = x;
}

public void SetY(float y) {
    this.y = y;
}

public void SetZ(float z) {
    this.z = z;
}

}

为您的课程使用 setter 和 getter,这完全是关于使用 OOP 编程概念 :)

如果您更具体地了解您要完成的工作,我相信我们可以提供帮助。

-弗朗西斯科

于 2013-03-12T03:19:56.457 回答
0

我的建议是按照 Amir 的建议引入一些类,或者至少通过引入一些命名良好的临时局部变量来使您的代码更易于理解。我不知道您要达到什么目的,但是使用一些局部变量进行重写可能会让您发现问题:

List<Vector<ArrayDeque<Vector_t>>> mData = new ArrayList<Vector<ArrayDeque<Vector_t>>>(
        6);

for (int i = 0; i < 6; ++i) {
    mData.add(i, new Vector<ArrayDeque<Vector_t>>());
}

for (Vector nextVector : mData) {

    for (int k = 0; k < 200; k++) {
        ArrayDeque<Vector_t> tempArray = new ArrayDeque<Vector_t>());
        tempArray.add(new Vector_t());
        nextVector add(tempArray);
    }
}
于 2013-03-12T03:04:07.123 回答