gpt4 book ai didi

java - 是否有必要为基于通用数组的缓冲区实现可迭代?

转载 作者:行者123 更新时间:2023-12-01 18:43:58 26 4
gpt4 key购买 nike

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

我创建了一个基于通用调整大小的循环数组的缓冲区。现在,由于数组已经是可迭代的,我是否需要实现可迭代?

编辑: @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();
}
}
}

文件:CircArrayPoints.txt

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

最佳答案

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

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

关于java - 是否有必要为基于通用数组的缓冲区实现可迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18686009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com