Java 是否有必要为基于数组的通用缓冲区实现iterable?

Java 是否有必要为基于数组的通用缓冲区实现iterable?,java,generics,data-structures,Java,Generics,Data Structures,我了解到创建通用数据结构背后的一个原因是使使用它的客户的生活变得简单。因此,作为该包的一部分,还应该使他/她的数据结构实现iterable,以便可以使用for-each()循环轻松地对其进行迭代 我创建了一个基于循环数组的通用大小调整缓冲区。现在,既然数组已经是iterable,我需要实现iterable吗 编辑:@Sotirios Delimanolis,这是我想到的: import java.io.BufferedReader; import java.io.FileReader; impo

我了解到创建通用数据结构背后的一个原因是使使用它的客户的生活变得简单。因此,作为该包的一部分,还应该使他/她的数据结构实现iterable,以便可以使用
for-each()
循环轻松地对其进行迭代

我创建了一个基于循环数组的通用大小调整缓冲区。现在,既然数组已经是iterable,我需要实现iterable吗

编辑:@Sotirios Delimanolis,这是我想到的:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

class ResizingCircularArray<E> {

    private int head = 0;
    private int tail = 0;
    private int size = 0; // a measure of non-null elements in the array
    private E[] arr;

    private void resize() {
        System.out.println("resizing array to size: " + 2 * size);
        @SuppressWarnings("unchecked")
        E[] tempArr = (E[]) new Object[2 * size];
        System.arraycopy(arr, head, tempArr, 0, size);
        head = 0;
        tail = head + (size - 1);
        arr = tempArr;
    }

    @SuppressWarnings("unchecked")
    public ResizingCircularArray() {
        arr = (E[]) new Object[5];
    }

    public void enqueue(E item) {
        if (item == null)
            throw new java.lang.NullPointerException(
                    " adding null values is not allowed ");
        if (size == arr.length) {
            resize();
        }
        arr[tail++] = item;
        size++;
        System.out.println("head : " + head + " tail : " + tail + " , size : "
                + size);
    }

    public E dequeue() {
        if (size == 0)
            throw new java.lang.NullPointerException("size = 0");
        if (size == arr.length / 4) {
            resize();
        }
        E item = arr[head];
        arr[head++] = null;
        size--;
        System.out.println("head : " + head + " tail : " + tail + " , size : "
                + size);
        return item;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public E sample(int offset) {
        if (offset < 0)
            throw new java.lang.IllegalArgumentException(
                    "negative index not allowed");
        return arr[head + offset];
    }

    public int size() {
        return size;
    }

    public void display() {
        for (E item : arr)
            System.out.print(item + " ");
        System.out.println("\n");
    }

    public static void main(String[] args) {

        ResizingCircularArray<String> r = new ResizingCircularArray<String>();
        String line = null;
        String[] segment, parsed;
        boolean endFlag = false;

        try (BufferedReader is = new BufferedReader(new FileReader(
                "CircArrayPoints.txt"))) {
            line = is.readLine();
            segment = line.trim().split(";");
            for (int i = 0; !segment[i].equals("stop") && !endFlag; i++) {
                parsed = segment[i].split(" ");
                switch (parsed[0]) {
                case "enq":
                    System.out.println("adding : " + parsed[1]);
                    r.enqueue(parsed[1]);
                    r.display();
                    break;
                case "deq":
                    System.out.println("dequeing : " + r.sample(0));
                    if (r.isEmpty()) {
                        System.out.println("Empty queue");
                        endFlag = true;
                        break;
                    }
                    r.dequeue();
                    r.display();
                    break;
                case "disp":
                    r.display();
                    break;
                default:
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

您可能不应该向用户公开内部数组,因此,是的,您应该使包装器对象可移植


另外,数组不是
Iterable
s-
javac
只是知道如何在for each循环中处理
Iterable
对象和数组。这可能会使数组看起来像是可移植的,但实际上这只是编译器处理的一个特殊情况。

您可能不应该向用户公开内部数组,所以是的,您应该使包装器对象可移植

另外,数组不是
Iterable
s-
javac
只是知道如何在for each循环中处理
Iterable
对象和数组。这可能会使数组看起来像是可编辑的,但实际上这只是编译器处理的一个特殊情况。

您不必这样做,但可以选择这样做

询问那些将使用您的数据结构的人。如果数据结构是可移植的,会让他们的生活更轻松吗

你不必这样做,但你可以选择这样做


询问那些将使用您的数据结构的人。如果数据结构是可移植的,会让他们的生活更轻松吗

现在,既然数组已经是iterable,我需要实现iterable吗?用代码解释一下。底层数据结构是否可移植并不重要。这是你想要迭代的顶级结构。也许吧。不要在互联网上询问陌生人,而是询问那些将使用数据结构的人。如果数据结构是合适的,会不会让他们的生活更轻松?你的数据结构听起来很像。您可能需要检查该内置类是否满足您的需要。现在,既然数组已经是可iterable,我需要实现一个可iterable吗?用代码解释一下。底层数据结构是否可移植并不重要。这是你想要迭代的顶级结构。也许吧。不要在互联网上询问陌生人,而是询问那些将使用数据结构的人。如果数据结构是合适的,会不会让他们的生活更轻松?你的数据结构听起来很像。您可能需要检查该内置类是否满足您的需要。感谢您指出这一点,我提到的
iterable
可能有点太松散了。我使用的是一个私有数组,所以它没有公开。尽量遵守规则。我会编辑这篇文章,把我的代码也包括进去。谢谢你指出这一点,我说的
iterable
可能有点太松散了。我使用的是一个私有数组,所以它没有公开。尽量遵守规则。我会编辑这篇文章,把我的代码也包括进去。是的,如果人们真的在实现我的代码,那就太好了。但我是一名学生,实现我的代码的只有我自己。因此这篇文章。是的,如果人们真的实现了我的代码,那就太好了。但我是一名学生,实现我的代码的只有我自己。因此,该职位。
enq a;enq b;enq c;enq d;enq e;enq f;enq g;enq h;enq i;enq j;enq k;enq l;deq;deq;deq;deq;deq;deq;deq;deq;deq;deq;deq;deq;deq;deq;deq;deq;deq;disp;stop