【问题标题】:Reversing and combining a list反转和组合列表
【发布时间】:2016-10-12 15:05:49
【问题描述】:

我有以下清单:

列表 1= 1,2,3,4,5,6

我正在尝试制作一个包含以下内容的列表:

列出 c= 1,6,2,5,3,4

但是,我不知道该怎么做。我知道如何迭代 6 但我不知道如何到达最后一个数字并向后迭代。我知道 ListIterator 可以用来倒退,但我仍然无法弄清楚。

这是我为添加原始内容所做的,我只是不明白如何向后迭代:

public static void q(Set<String>list1)
{
    Set<String>combined = new HashSet();
    Iterator<String> forward = list1.iterator();
    Iterator <String> backwards = list1.iterator();

    for (int i=0; i<list1.size(); i++)
    {
        combined.add(forward.next());

        //code to go backwards
    }
}

【问题讨论】:

  • 你的代码在哪里?
  • 我添加了我所拥有的。然而,一点用处都没有。我不知道如何向后迭代。 @f1sh
  • 如果您需要特定的顺序,Set 并不是真正正确的数据类型。

标签: java loops iterator set


【解决方案1】:

这不是为了解决您的问题,而是向您展示如何使用ListIterator 来倒退,因为您无法弄清楚。

List<Integer> list = new ArrayList<>();
for (int n = 1; n <= 6; n++) { // Add 1, 2, ... 6 to list
    list.add(n);
}

ListIterator it = list.listIterator(list.size());
while (it.hasPrevious()) {
    System.out.println(it.previous());
}

ListlistIterator 方法允许您指定要开始的索引作为参数。 ListIteratorhasPrevious 方法检查是否存在前一个元素(不言自明)。 ListIteratorprevious() 方法返回列表中的前一个元素并将光标位置向后移动。

使用ListIterator,您可以分别使用next()previous(),随意前进和后退。

或者,使用 for 语句而不是使用 ListIterator...

for (int i = list.size() - 1; i >= 0; i--) {
    System.out.println(list.get(i));
}

【讨论】:

  • 不知道为什么没有一个答案被接受甚至赞成;但你的看起来不错。所以让我们做我能做的吧。
【解决方案2】:

鉴于您在谈论列表,我不确定您是否真的想要一个 Set。这是没有显式使用列表迭代器的想法,但是它们的行为相似。

如何使用列表迭代器:http://www.java2s.com/Tutorial/Java/0140__Collections/ListIteratorInreverseorder.htm

public static List<Integer> interleaveFrontBack(List<Integer> list) {

    if (list.size() <= 2){
        return new LinkedList<Integer>(list);
    }

    List interleaved = new LinkedList<Integer>();
    int end = list.size() - 1;
    int front = 0;

    while (end > front){
        interleaved.add(list.get(front++));
        interleaved.add(list.get(end--));
    }

    // if odd sized list need to add last element
    if (end == front){
        interleaved.add(list.get(front));
    }

    return interleaved;
}

【讨论】:

  • 不知道为什么没有一个答案被接受甚至赞成;但你的看起来不错。所以让我们做我能做的吧。
【解决方案3】:

简单的算法是

1.) 只需使用两个位置,i =0 用于递增,j = size-1 用于递减

2.) 在遍历内容列表中间时使用ij 位置向新列表添加元素

Integer []aa=new Integer[]{1,2,3,4,5,6};
List<Integer> list =Arrays.asList(aa);
int n=list.size();
List<Integer> list2 =new ArrayList<>();
    for (int i = 0,j=list.size()-1; i <n/2 ; i++,j--) {
        list2.add(list.get(i));
        list2.add(list.get(j));        
    }
//    if(n%2!=0) list2.add(list.get(n/2)); // un-comment this , to handle 
                                          // odd list size too ,dynamism 

list2.forEach(i->System.err.print(i+" "));

输出:

1 6 2 5 3 4 

【讨论】:

  • 不知道为什么没有一个答案被接受甚至赞成;但你的看起来不错。所以让我们做我能做的吧。
  • @GhostCat 当然老兄,也许 OP 感到困惑或忙碌:P
【解决方案4】:

假设您只是想将第一个列表的最后一个元素放在第二个索引上,您可以执行以下操作:

 List<Integer> input = Arrays.asList(1, 2, 3, 4, 5, 6);

 // create new list that initially contains first and last element of input list
 List<Integer> output = new ArrayList<>(Arrays.asList(input.get(0), input.get(input.size()-1)));

 // now iterate the "in between" input elements and add them to output
 for (int i=1; i < input.size() -1 ; i++) {
   output.add(input.get(i));
 }

 System.out.println("in: " + input);
 System.out.println("out: " + output);

当然,以上只是其中一种方式;还有很多

【讨论】:

    【解决方案5】:

    不确定您到底在寻找什么以及您的代码在哪里出错。你可以试试:

    List<Integer> intergers = new ArrayList<>();
    for(int i = 1; i < 7; i++) {
        if(i < 6) {
            intergers.add((i-1), i);
        } else {
            intergers.add(1, i); //when i is 6 place it in the second index                 
        }
    }
    System.out.println("List: " + intergers.toString());
    

    使用 java list 您可以选择索引,如果该索引具有值,则该值将被推送到下一个索引。这是我能想到的最简单的事情。这是它打印出来的:

    列表:[1、6、2、3、4、5]

    【讨论】:

    • 不知道为什么没有一个答案被接受甚至赞成;但你的看起来不错。所以让我们做我能做的。但是:使用 x 作为 int 计数器的名称是非常糟糕的做法。更好地将 i、j、k 用于此类索引!
    • 更新为使用“i”。也从未有人告诉过“x”是不好的做法,所以谢谢。
    • 可能更多的是隐式约定。您会看到,在进行数学运算和处理“整数”时,您通常使用 i、j、...,而在处理有理数时,您会使用 x 和 f(x),等等。在迭代多维数组时,可能会想使用 x, y, z, ... 作为索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多