【问题标题】:What is the proper Java format in a Type array? [duplicate]Type 数组中正确的 Java 格式是什么? [复制]
【发布时间】:2020-05-21 15:20:33
【问题描述】:

我遇到了导致 Java 编译被拒绝的格式问题。

此代码在 Netbeans 中有效,但 Web 编译检查器拒绝接受它。

我正在创建一个迭代器,我想要一个链表中随机排序的节点数组。

使用 对该迭代器进行类型检查。为了检查它,我使用 表示

在代码中,例如有“int[] vals = new int[numEntries]”,它可以毫无怨言地工作。这是一个整数列表。我想要一个 Node 对象的列表。可以看到投诉是它正在寻找 Node 并找到 Node。

[unchecked] unchecked conversion required: RandomizedQueue<Item>.Node<Item>[] found: RandomizedQueue.Node[] where Item is a type-variable: Item extends Object declared in class RandomizedQueue

有问题的行是 Node[] ret1 = new Node[numEntries]。同样,代码在 Netbeans 中运行良好并给出了正确的结果。只是这个警告正在杀死 Web 编译器,我不知道如何绕过它。

我尝试了 Node[] = new Node[numEntries],但它给出了错误而不是警告。我还尝试在子例程中删除 标记,但这给了我在不同点的未经检查的转换。什么是不会产生警告的正确格式??

    public Iterator<Item> iterator() {
    Iterator<Item> it = new Iterator<Item>() {
        private final Node<Item>[] elements = init1();
        private int indx = 0;

        private Node<Item>[] init1() {
            Node<Item>[] ret1 = new Node[numEntries];
            Node<Item> curr;
            int[] vals = new int[numEntries];
            int i, j, val;
            int[] free = new int[numEntries];
            for( i=0; i<numEntries; i++) {
                free[i] = i;
            }
            for( i=0; i<numEntries; i++) {
                j = numEntries-i;
                val = StdRandom.uniform(j);
                vals[i] = free[val];
                free[val] = free[j-1];
            }

            for( i=0; i<numEntries; i++) {
                curr = head;
                j = vals[i];
                while( j-- > 0) curr = curr.next;
                ret1[i] = curr;
            }
            return ret1;
        }

【问题讨论】:

  • 也许this answer 会为您解决问题。您可以使用参数化列表而不是数组。
  • 一个问题是我不允许包含任何库,包括 java.lang 之外的任何内容。我被允许在 algs4.jar 中使用东西,但我没有找到任何可以解决问题的东西。我基本上想做的是制作一个对象数组。
  • 并且提供的链接解释了为什么你不能在没有 Java 警告的情况下这样做。另外,如果你写的是真的,你也不能使用迭代器,因为它(连同 ArrayList)在 java.util 包中。
  • 作为这个问题的一个特例,java.util.Iterator 是允许的。 ArrayList 和 LinkedList 是明确禁止的,但一般来说 java.util 中的东西和其他大多数东西都没有了。
  • 我有一种令人毛骨悚然的感觉,您的 Node 类应该是链表的一个节点。在这种情况下,您应该能够通过遍历列表来实现迭代器,而无需借助数组创建。也许您可以编辑帖子并澄清您到底想在这里完成什么。并创建一个minimal reproducible example

标签: java node.js format


【解决方案1】:

https://www.javarticles.com/2014/12/arrays-of-parameterized-type.html

基本上你不能有类型数组,你必须使用 ArrayList 或其他东西。

话虽如此,在我看来您对链表的用途有些困惑

因此,在 java 中,数组的大小是固定的,但允许您根据它在数组中的位置立即查找一个值。如果您不希望数组发生很大变化,这很好,但是如果您有一个由 5 个字符组成的数组 a,b,c,d,e 并且想在中间添加 g,那么您要做的就是创建一个新的数组大小为 6,然后复制所有值并将所需的值插入任何需要的地方。还不错,但想象一下数组有 100,000 个字符而不是 5 个,复制所有可能导致性能问题的字符,尤其是如果它经常发生

为了解决这个问题,有链表,因为值是链接在一起的,为g创建一个新节点很简单,将c.next指向g,然后将g.next指向d,你不必疯狂复制大小数组,一切都很好。不幸的是,您无法立即查找第 x 个项目,您必须获取第一个项目,然后调用 node.next() x 次,但在很多情况下会根据其位置查找值真的不需要。

您将链表的所有节点存储在一个数组中,这是多余的,并且使链表毫无意义,因为您还不如只拥有一个 Items 数组并通过简单地递增任何索引变量来获取下一项'用于访问数组。

想想迭代器需要做什么,它需要从列表的开头开始,然后遍历列表中的所有值。这几乎正​​是链表的用途,但数组也可以完成这项工作。如果你想使用链表,而不是存储节点数组private final Node&lt;Item&gt;[] elements = init1();,你只需要存储当前节点private Node currentNode = init1();——需要更改init1以返回第一个节点。然后在迭代器next() 函数中,您只需执行类似

Node<Item> toReturn = currentNode;
currentNode = currentNode.next();
return toReturn;

您可以通过完全放弃链表并仅使用常规 Item[] 数组private final Item[] elements = init1(); 然后使用递增索引来遍历值来实现相同的目的,无论哪种方式最终结果都是相同的。

【讨论】:

  • 主要是感谢您的帮助。事实证明,警告并没有杀死编译器——它只是一个警告。另一方面,我认为 algs4.jar 中的所有例程都可以使用,但事实并非如此。我选择在他们的 jar 中使用 readLine,而 readLine 是被禁止的,我需要使用 readString。没关系,这些理论编程问题的目的是为了学习,你教我为什么一个简单的数组不能处理类型化的输入——所以值得努力
  • 昨晚睡觉的时候我也想到了使用Item[]元素,而不是Node[]元素的想法。今天早上我尝试了 Item[] elements = new Item[N] 失败了。在经历了更复杂的情况之后,对我来说很明显“new Item[N]”会失败,我需要从 new Object[N] 进行转换。演员会给出同样的警告——但这是一个警告而不是错误。简而言之,再次感谢您的帮助以准确显示问题所在。我接受了您的解决方案作为解决问题的另一种方式。
  • 嗯,你知道为什么 Item[] elements = new Item[N] 失败了吗?据我所知,这应该可以工作,通常你应该更喜欢做类似的事情而不是转换一个对象数组
猜你喜欢
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2020-10-22
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多