嵌套列表结构管理

时间:2013-03-12 02:41:53

标签: java

我很难尝试管理列表清单。我已经声明并初始化了我的数据结构:

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);

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

请帮我解决这个问题。

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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编程概念:)

如果你对你想要完成的事情稍微具体一点,我相信我们可以提供帮助。

-Francisco