Populating a List with a contiguous range of integers

前端 未结 4 1943
耶瑟儿~
耶瑟儿~ 2020-12-14 15:12

I\'d like to have a list which contains the integers in the range 1 to 500. Is there some way to create this list using Guava (or just plain Java) without having to loop th

相关标签:
4条回答
  • 2020-12-14 15:29

    The new, Java 8, way:

    List<Integer> range = IntStream.range(0, 500).boxed().collect(Collectors.toList());
    
    0 讨论(0)
  • 2020-12-14 15:32

    You can also use Apache Commons IntRange utility

    E.g.

        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;
    }
    
    0 讨论(0)
  • 2020-12-14 15:33

    Using Guava, you can resort to a Range: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Range.html

    Of course, there will still be loops in your code, but they just might be hidden from the code for simplicity sake.

    For instance:

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

    Check http://code.google.com/p/guava-libraries/wiki/RangesExplained for some more examples.

    Keep in mind that if you do need to eventually iterate over the Range, you cannot do so directly, only through using DiscreteDomains.integers().

    0 讨论(0)
  • 2020-12-14 15:41

    Btw. if it is only to be used in some sort of iteration, you could simply create a basic class which implements the Iterable interface, to skip the insertion altogether.

    Something like this:

    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++;
            }
        }
    }
    

    Which could be used in some way like this:

    Iterable<Integer> range = new IntegerRange(1, 500);
    
    for (int i : range) {
        // ... do something with the integer
    }
    
    0 讨论(0)
提交回复
热议问题