从List - Java获取间隔

时间:2015-12-04 21:44:35

标签: java list

如果可能,请从List<Object>

获取间隔

间隔在两个元素之后 实例:

List<String> myList = new ArrayList<>();
myList.add(a);
myList.add(b);
myList.add(c);
myList.add(d);
myList.add(e);

获取第一个间隔(0和1上的元素):

  

a,b

获得第二个间隔(第2和第3个元素):

  

c,d

获得第3个间隔(4和5上的元素不存在)

  

ë

有简单的方法吗?

当然,我可以自己制作代码。但是有简单的方法吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

如果您不介意在项目中添加库,请尝试使用Google Guava:

List< String > list = Arrays.asList( a, b, c, d, e );
List< List< String > > sets = Lists.partition( list, 2 );

sets.forEach( ( set ) -> System.out.println( set ) );

这样,如果您以后需要对不同数量的值进行分组,则可以更改分区的大小。

输出:

[a, b]
[c, d]
[e]

答案 1 :(得分:1)

首先,明显的答案是:

List<String> ls = new ArrayList<>();
ls.add("Hello");
ls.add("World");
ls.add("Pair");
ls.add("Words");
ls.add("Another");
ls.add("Pair");

for (int i = 0; i < (ls.size() - 1); i = i + 2) {
    System.out.println("First: " + ls.get(i) +
                       ", Second: " + ls.get(i + 1));
}

输出:

First: Hello, Second: World
First: Pair, Second: Words
First: Another, Second: Pair

如果您需要多个项目组而不是两个项目(产生相同的输出),则另一种解决方案可能会有效:

List<String> ls = new ArrayList<>();
ls.add("Hello");
ls.add("World");
ls.add("Pair");
ls.add("Words");
ls.add("Another");
ls.add("Pair");

for (int i = 0; i < (ls.size() - 1); i = i + 2) {
    ListIterator<String> iter = ls.listIterator(i);
    System.out.println("First: " + iter.next() +
                       ", Second: " + iter.next());
}

但一般来说,如果你想这样做,你就可以制作一个容器来容纳你的对子,并按照常规的方式迭代对子列表(产生相同的输出)。

class Pair<T,U> {
    T _1;
    U _2;
    public Pair(T t, U u) { _1 = t; _2 = u; }
}

List<Pair<String,String>> pairs = new ArrayList<>();
pairs.add(new Pair<>("Hello", "World"));
pairs.add(new Pair<>("Pair", "Words"));
pairs.add(new Pair<>("Another", "Pair"));

for (Pair<String,String> pair : pairs) {
    System.out.println("First: " + pair._1 +
                       ", Second: " + pair._2);
}

如果要获得所有功能/不可变,可以将Paguro与Java 8流一起使用(产生相同的输出):

List<Tuple2<String,String>> ls =
        vec(tup("Hello", "World"),
            tup("Pair", "Words"),
            tup("Another", "Pair"));

ls.forEach(pair -> System.out.println("First: " + pair._1() +
                                      " Second: " + pair._2()));

总结:没有。没有&#34;分区&#34; List上的方法。但是SortedSet上有一些分区方法(headSet(to)tailSet(from)subSet(from, to)),所以如果您的列表中没有重复项,并且您的项目已经订购,那么可以玩那个。

答案 2 :(得分:1)

如果你想要使用图书馆

public static void main(String[] args) {
    List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5);

    int intervalSize = 2;
    int maxIntervals = (int) Math.ceil(myList.size() / (1.0*intervalSize));
    for (int i = 1; i <= maxIntervals; i++) {
        System.out.println(getInterval(myList, i, intervalSize));
    }
    // [1, 2]
    // [3, 4]
    // [5]
}

private static List getInterval(List lst, int interval, int intervalSize) {
    if (intervalSize < 0 || interval <= 0) {
        throw new IllegalArgumentException();
    }

    int intervalStart = -intervalSize;

    while (intervalStart < lst.size() && interval > 0) {
        intervalStart += intervalSize;
        interval--;
    }

    int intervalEnd = Math.min(intervalStart + intervalSize, lst.size());
    return lst.subList(intervalStart, intervalEnd);
}