【问题标题】:How can I slice an int array by stride in Java?如何在 Java 中跨步对 int 数组进行切片?
【发布时间】:2016-04-03 07:52:01
【问题描述】:

我正在学习 Java。

在 Python 中,我可以:

my_list = [1,2,3,4]
my_new_list = my_list [::-1]
print my_new_list                # [4,3,2,1]

我可以在 Java 中使用什么方法来对 int 数组执行此操作吗?

Edit1:抱歉举了一个不好的例子。 my_list [::-2] 怎么样?

Edit2:我的意思是 my_list [::-2] 就像

my_list = [1,2,3,4]
my_new_list = my_list [::-2]
print my_new_list                # [4,2]

Edit3:Python 中的跨步切片是每一步“检查”列表中的项目(步幅)。如果步长为负数,Python 会从列表末尾到列表开头检查项目。例如:

my_list = [1,2,3,4,5,6,7,8,9]
my_list1 = my_list[::2]       # my_list1 becomes [1,3,5,7,9]
my_list2 = my_list[::3]       # my_list2 becomes [1,4,7]
my_list3 = my_list[::4]       # my_list3 becomes [1,5,9]
my_list4 = my_list[::-3]      # my_list4 becomes [9,6,3]

【问题讨论】:

  • @BoristheSpider 谢谢你的方法。大步切片怎么样?像 my_list [::-2]
  • 这是一个单独的问题 - 请在发帖时描述您的完整问题,而不是其中的部分
  • @BoristheSpider 我很抱歉这个令人困惑的例子
  • 此外,并非所有 Java 开发人员都会说 Python - 请描述问题、输入和预期输出。
  • @BoristheSpider 抱歉,我会尽快编辑。

标签: java arrays methods slice stride


【解决方案1】:

您可以将数组转换为列表,然后在该列表上使用Collections.reverse()

Integer a[]={1,2,3,4};
List <Integer> list = Arrays.asList(a);
System.out.println(list);
Collections.reverse(list);
System.out.println(list);

DEMO

【讨论】:

  • 我很抱歉这个误导性的例子,我可以做类似 my_list [::-2] 的事情吗?
  • @JayWong 你能解释更多关于输出的信息吗
【解决方案2】:

您可以通过以下方式进行操作,在Collections#reverse 的帮助下使用该方法,我们首先必须将数组转换为列表,在反转列表后,我们将再次将其转换为数组。如果可能,你应该最好使用List而不是数组。

public class Test {

    public static void main(String[] args) {
        Integer[] arr = new Integer[] { 1, 2, 3, 4 };
        List<Integer> list = Arrays.asList(arr);
        Collections.reverse(list);
        arr = list.toArray(new Integer[list.size()]);
        System.out.println(Arrays.toString(arr));
    }

}

输出

[4, 3, 2, 1]

【讨论】:

    【解决方案3】:

    Apache Commons Lang 有一个实用方法:

    ArrayUtils.reverse(int[] array)
    

    【讨论】:

      【解决方案4】:

      Java 没有你想要的内置东西,但你可以为它构建你自己的逻辑,就像这样,只需将值放在 val 中,例如 my_list[::2] 2 在这种情况下为 @987654322 @ 将是 2

      public static void main (String[] args) throws java.lang.Exception
      {
      int ml[] = {1,2,3,4,5,6,7,8,9};
      int val = -2;
      ArrayList al = new ArrayList();
      if(val>0){
      for(int i = 0 ; i<ml.length;i+=val){
          al.add(ml[i]);
      }
      }
      else if(val<0){
      for(int i = ml.length-1 ;  i>=0; i+=val){
          al.add(ml[i]);
      }   
      
      }
      
      
      for(int i = 0 ; i<al.size();i++){
          System.out.println(al.get(i));
      }
      
      }
      

      【讨论】:

      • @JayWong 这段代码一团糟——我不会使用它。您最好使用智能Iterator 设计来创建基础数据的“视图”。
      • 如果你给他一个更好的解决方案而不是告诉他怎么做,我将不胜感激,他是java的新手。
      【解决方案5】:

      你可以在 Java 8 中这样写

      int a = { 1, 2, 3, 4 };
      int step = -2;
      
      int b = IntStream.range(0, a.length)
                  .filter(i -> i%step == 0)
                  .map(i -> a[(step < 0) ? a.length-i-1 : i])
                  .toArray();
      

      它应该适用于您提供的所有示例数组和步骤。

      【讨论】:

        猜你喜欢
        • 2016-10-22
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        相关资源
        最近更新 更多