如何为锯齿状数组 java 覆盖 next()?

Posted

技术标签:

【中文标题】如何为锯齿状数组 java 覆盖 next()?【英文标题】:How can I override next() for jagged array java? 【发布时间】:2019-02-21 09:56:33 【问题描述】:

我有一个锯齿状数组。 如何覆盖next(),以便逐步获取其元素?

【问题讨论】:

您可以从了解迭代器内部的工作原理开始。 你能告诉我们你尝试了什么吗?在 *** 上,人们希望看到已经做出的努力并能够帮助您找到解决方案。 数组没有实例方法。您无法覆盖不存在的内容... 例如,我有一个数组:int it = 1, 2, 3, 4, 5。我需要覆盖 next(),以逐步获得 1、2、3、4 和 5。在我想看到的输出中:it.next() - 我得到 1,it.next() - 我得到 2 等等。 正如@Turing85 提到的,数组没有迭代器,因此无法覆盖 next()。但是你可以从here开始修改二维锯齿数组的代码 【参考方案1】:

这可能是您问题的错误答案。在这种情况下,我会删除它,但也许你可以将它用于你想要实现的目标:

int[][] it = 1,2, 3,4,5;

OfInt iterator = Arrays.stream(it).flatMapToInt(x -> IntStream.of(x)).iterator();
iterator.forEachRemaining((IntConsumer) System.out::print);

流式传输锯齿状数组,将其平面映射到一个 IntStream 中,然后用它做你想做的事。在此示例中,我获取了迭代器,但您可能只想要:

Arrays.stream(it).flatMapToInt(x -> IntStream.of(x)).forEach((IntConsumer) System.out::print); 

forEach你可以做你需要的,或者使用IntStream的一些其他方法

【讨论】:

【参考方案2】:

谢谢大家的回答,我在俄语 *** 中找到了答案: https://ru.***.com/questions/867881/java-iterator-%D0%B4%D0%BB%D1%8F-%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0

公共类 IteratorFor2DArray 实现迭代器

private int size;
private int i = 0;
private int j = 0;
private int[][] values = new int[i][j];
private int position = 0;

public IteratorFor2DArray(int[][] values) 
    this.values = values;
    this.size = countOfElements(values);


private int countOfElements(int[][] values) 
    int count = 0;
    for (int[] row : values) 
        count += row.length;
    
    return count;


@Override
public boolean hasNext() 
    return position < size;


@Override
public Integer next() 
    if (position >= size) 
        throw new NoSuchElementException();
    
    int element = values[i][j];
    position++;
    j++;
    while (i < values.length && j >= values[i].length) 
        j = 0;
        i++;
    
    return element;

【讨论】:

【参考方案3】:

我还找到了另一种方法:

public class IteratorFor2DArray implements Iterator 

    private int[][] data;
    private int i, j;

    public IteratorFor2DArray(int[][] data) 
        this.data = data;
    

    @Override
    public Integer next() 
        if (!hasNext()) 
            throw new NoSuchElementException();
        
        int element = data[i][j];
        j++;
        while (i < data.length && j >= data[i].length) 
            j = 0;
            i++;
        
        return element;
    

    @Override
    public boolean hasNext() 
        return (i < data.length && j < data[i].length);
    

【讨论】:

以上是关于如何为锯齿状数组 java 覆盖 next()?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 electron + react js + next 进行生产构建

Next js中如何为嵌套动态路由命名页面模板?

如何为外部 url 正确设置 Next image loader url

如何为单个包生成覆盖率 xml 报告?

NextJS:如何为生产构建添加屏幕加载?

如何为 Qt 设置 Bullseye 代码覆盖率