【问题标题】:How can I get the length of a generic data structure without knowing the type of data structure it will be?如何在不知道数据结构类型的情况下获得通用数据结构的长度?
【发布时间】:2019-09-30 03:48:07
【问题描述】:

我创建了自己的数据结构,其功能类似于 ArrayDeque 并扩展了 AbstractList。它的重点是保存其他数据结构,但不允许具有超过指定数量元素的结构。

例如(我的构造函数):

public MyD(Class<T> t, int limit) 
{
}

其中 limit 决定了每个数据结构允许添加到 ArrayDeque 的元素数量。

我的问题是,因为我使用的是泛型,所以从技术上讲,我当时不知道我正在使用哪种类型的数据结构。

public void add(int i, T structure) {}

结构可以是任何东西,从数组到 ArrayList,再到队列等。

我的问题:如果我知道它总是某种形式的数据结构,有没有办法获取一个通用值并对其进行通用转换以获得其中的元素数量。

我尝试将它转换为一个简单的数组 [],但如果传递一个 List,它将破坏功能。

@SuppressWarnings({"unchecked"})
T[] array = (T[])x;

if(array.length > b) { return; }

【问题讨论】:

  • 如果添加 2 个数组,一个有 3 个元素,接下来有 ​​4 个元素...你认为 MyD 的大小是 7 吗?
  • @DariusX。不,MyD 的大小为 2。MyD 的元素大小分别为 3 和 4。

标签: java generics data-structures collections


【解决方案1】:

您可以使用一些反射来测试传递的结构是数组还是集合,然后相应地获取其大小:

public void add(int i, T structure) {
    int size;
    if (structure.getClass().isArray()) {
        size = Array.getLength(structure);
    } else if (structure instanceof Collection) {
        size = ((Collection) structure).size();
    } else {
        throw new IllegalArgumentException("Structure is neither an array nor a collection");
    }
    if (size > limit) {
        return;
    }
    // ...
}

【讨论】:

  • 这是一个很好的答案起点,我实现了它,但由于某种原因,它没有得到通过 add 函数传递的任何内容。不幸的是,我不知道传递的是哪种类型的数据结构,但我将大小设置为 -1 以捕捉是否没有变化,并且永远不会有任何变化。
  • @Kahl “它没有得到通过 add 函数传递的任何内容”是什么意思?您能分享一下您的完整添加方法以及如何调用它吗?
  • @Holger 你是对的。最初我正在测试在构造函数中传递的Class&lt;T&gt; t,所以我不能使用instanceof。 Bu 然后我将其替换为structure.getClass() 以使其更清晰。
  • 这在很大程度上回答了主要问题,所以我将其标记为答案。事实证明,我还需要查看有效的链表,因为它们使用了一种叫做块的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
相关资源
最近更新 更多