【问题标题】:Populating a List with a contiguous range of integers用连续的整数范围填充列表
【发布时间】:2013-05-18 15:34:18
【问题描述】:

我想要一个包含 1 到 500 范围内的整数的列表。有没有办法使用 Guava(或纯 Java)创建这个列表,而无需遍历该范围并单独添加值在我自己的代码中?

【问题讨论】:

  • 无论你做什么,都会有一个循环(在你的代码或你使用的辅助方法中)。
  • (我们现在正在编辑问题以包含他们自己的答案吗?)

标签: java guava


【解决方案1】:

新的 Java 8 方式:

List<Integer> range = IntStream.range(1, 501).boxed().collect(Collectors.toList());

【讨论】:

  • 这很酷;但是,您没有收到强制转换警告/编译器错误吗?
  • 不,是吗?如果是这样,可能是因为您没有在您的 IDE 中启用对 Java 8 语言功能(或更早版本——我在考虑类型推断)的支持(可能有 Java 8 JDK,可以访问所有库而不是有语言功能支持)。
【解决方案2】:

使用 Guava,您可以求助于 Range: https://guava.dev/releases/19.0/api/docs/com/google/common/collect/Range.html

当然,您的代码中仍然会有循环,但为了简单起见,它们可能会从代码中隐藏。

例如:

Range<Integer> yourValues = Range.closed(1, 500);

查看https://github.com/google/guava/wiki/RangesExplained 了解更多示例。

请记住,如果您确实需要最终迭代Range,则不能直接这样做,只能通过使用DiscreteDomains.integers()

【讨论】:

  • 感谢这为我指明了正确的方向。我需要的最终代码是 ImmutableList.copyOf(ContiguousSet.create(Range.closed(1, 500), DiscreteDomain.integers()))
  • @jgm 您不必复制ImmutableList,因为ContiguousSet 已经是一个不可变集合(ImmutableSortedSet),它的asLst() 方法返回ImmutableList 视图。跨度>
  • 顺便说一句,从ContiguousSet 创建ImmutableList 具有无限范围(如Range.atLeast(1))会导致OutOfMemoryError。
【解决方案3】:

顺便说一句。如果它只是用于某种迭代,您可以简单地创建一个实现Iterable 接口的基本类,完全跳过插入。

类似这样的:

import java.util.Iterator;

public class IntegerRange implements Iterable<Integer> {
    private int start, end;

    public IntegerRange(int start, int end) {
        if (start <= end) {
            this.start = start;
            this.end = end;
        } else {
            this.start = end;
            this.end = start;
        }
    }

    @Override
    public Iterator<Integer> iterator() {
        return new IntegerRangeIterator();
    }

    private class IntegerRangeIterator implements Iterator<Integer> {
        private int current = start;

        @Override
        public boolean hasNext() {
            return current <= end;
        }

        @Override
        public Integer next() {
            return current++;
        }
    }
}

可以以这样的方式使用:

Iterable<Integer> range = new IntegerRange(1, 500);

for (int i : range) {
    // ... do something with the integer
}

【讨论】:

    【解决方案4】:

    您还可以使用 Apache Commons IntRange 实用程序

    例如

        private List<Integer> getAllIntegerRange(Integer firstValue, Integer secondValue) {
        List<Integer> values = new ArrayList<>();
        IntRange rang = new IntRange(firstValue, secondValue);
        int[] ranges = rang.toArray();
        for (int i : ranges) {
            values.add(i);
        }
        return values;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多