当前位置: 首页 > 知识库问答 >
问题:

用Java中的多维数ArrayList实现ArrayList的反向子集

商勇
2023-03-14

我正在尝试使用多维列表中提供的索引来反向列表中的子列表。我没有太多使用多维列表/数组的经验。我不明白为什么这行不通。

/*
   Given a List<Integer> list and List<List<Integer>> operations
   reverse the sublist and print out the list after all the operations have been done.
   Ex: [5, 3, 2, 1, 3]
       [[0,1], [1, 3]]
*/

import java.util.*;
public class ReverseParameters {
   public static void main(String[] args) {
       List<Integer> list = Arrays.asList(5, 3, 2, 1, 3);
       List<List<Integer>> operations = new ArrayList<>(2);
       for(int i= 0; i < 3; i++){
           operations.add(new ArrayList<>());
       }
       operations.get(0).add(1);
       operations.get(1).add(3);

       subList(list, operations);
   }
   public static void subList (List<Integer> list, List<List<Integer>> operations) {
       System.out.println(list);
       int vertCount = operations.size();
       for (int i = 0; i < vertCount; i++) {
           int edgeCount = operations.get(i).size();
           for (int j = 0; j < edgeCount; j++) {
               int startInd = i;
               int endInd = operations.get(i).get(j);
               int shift = endInd - startInd;
               int right = Math.min(i + shift - 1, list.size() - 1);
               int temp = 0;
               while (startInd < right) {
                   temp = list.get(startInd);
                   list.set(startInd, list.get(right));
                   list.set(right, temp);
                   startInd+=1;
                   right-=1;
               }
               System.out.println();
               System.out.printf(" %d %d%n", startInd, endInd);
               System.out.println();
           }
       }
       System.out.println(list);
   }
}
[5, 2, 3, 1, 3]
[3, 1, 2, 5, 3]

共有1个答案

尉迟兴修
2023-03-14

您使用不必要的变量使代码过于复杂,从而很难发现问题。请使用一个更简单的代码进行解释:

public static void main(String[] args) {
    List<Integer> list = Arrays.asList(5, 3, 2, 1, 3);
    List<List<Integer>> operations = new ArrayList<>(2);
    // Initialize your operations
    operations.add(Arrays.asList(0,1));
    operations.add(Arrays.asList(1,3));
    subList(list, operations);
}
public static void subList (List<Integer> list, List<List<Integer>> operations) {
    // You just iterate over the operations
    for (List<Integer> operation : operations) {
        // For each operation, store left and right indexes.
        int left = operation.get(0);
        int right = operation.get(1);
        // Iterate until both indexes find each other
        while (left < right) {
            // Swap left and right elements in input list
            int aux = list.get(left);
            list.set(left, list.get(right));
            list.set(right, aux);

            // Now you move your indexes
            ++left;
            --right;
        }
    }
    System.out.println(list);
}

请注意,根据问题的要求,您可能还需要验证操作索引是否在列表边界内,以便最终不会得到ArrayIndexOutOfBoundsException。所以对边缘情况一定要小心。

 类似资料:
  • 我正在尝试用Java编写一个程序,该程序将计算整数数组(具有5个元素)中的所有元素组合,并将这些组合输出到ArrayList。我在下面包含了我的代码。 我使用按位运算来查找组合。每个组合都构造为一个 ArrayList(Integer),称为“writeitem”。然后我想将它们存储在另一个名为“master”的ArrayList中,它必须具有ArrayList(ArrayList(Integer

  • 问题内容: 以下代码输出 但是,我期望的是 我哪里错了? 问题答案: 您将两次向同一内部引用添加到外部列表。因此,当您更改内部列表时(通过添加300),您会在“两个”内部列表中看到它(实际上,只有一个内部列表,外部列表中存储了两个引用)。 为了获得理想的结果,您应该创建一个新的内部列表:

  • 如何维护唯一数组的? 例如,如果我有以下数组:

  • 我有一个ArrayList of String。 在每个索引上的外部ArrayList中,每个内部ArrayList有四个项目,有四个参数。 联系人ID 联系人姓名 联系地址 联系号码 现在,我想根据Contact Name参数对的完整ArrayList进行排序。 意味着我要访问外部Arraylist,外部Arraylist的每个索引上存在的内部Arraylist应该根据联系人名称进行排序。 比较

  • 问题内容: 无论如何,我对ArrayLists还是很陌生,但是我在这个项目中需要它们,如果你们能帮助我,我将不胜感激! 基本上,我需要创建一个多维数组列表来保存字符串值。我知道如何使用标准数组来执行此操作,但是这样做并不好,因为我不知道数组的大小,我所知道的只是它会有多少个尺寸。 因此,如果你们知道如何制作“具有2 / +尺寸的可动态调整大小的数组”,请告诉我。 在此先感谢, 安迪 编辑/更新 也

  • 问题内容: 我必须创建一个大小未知的二维数组。因此,我决定使用2d ArrayList,问题是我不确定如何初始化这样的数组或存储信息。 说我有以下数据 .... etc多达大量的随机连接 我想插入 数组可以自动为我更新列/行吗 任何帮助表示赞赏,谢谢 问题答案: 我不确定如何初始化这样的数组或存储信息。 像这样: 或者,如果您喜欢这样的话: 要插入新行,您可以 并在您执行的操作上附加另一个元素 这