【问题标题】:Move part of array to the front in Java在Java中将数组的一部分移到前面
【发布时间】:2014-08-26 11:39:21
【问题描述】:

我有一个类似的数组:

[null, null, 3, 4, null]

我想把它改成类似的数组:

[3, 4, null, null, null]

我知道如何手动完成,但看起来很难看。 是否有任何内置(使用最少的自定义代码)方法来做到这一点? (可能与 System.arraycopy 相关)

我完成了这样的事情(感谢@Braj 的想法):

@Test
public void test() {
  Integer[] k = new Integer[]{null, null, 3, 2, 1};
  k[1] = null;
  Arrays.sort(k, new Comparator<Object>() {
    public int compare(Object o1, Object o2) {
      System.out.println(o1);
      if (o1 == null) return 1;
      else if(o2 == null) return -1;
      else return 0;
    }
  });
  assertArrayEquals(
    new Integer[]{3, 2, 1, null, null},
    k
  );
}

如果有人有兴趣,a bigger problem which tried to solve with this code

【问题讨论】:

  • 请附上您尝试过的代码。
  • 你关心非空元素的排序吗?是否应该以任何特定方式对它们进行排序?他们应该保留最初的订单吗?
  • 是的,他们应该保留最初的订单
  • 1) 它看起来很丑 --> 把那个丑陋的代码放在一个方法中,你就不用再看到那个丑陋的代码(抽象)了。至于使用API​​,有java.util.Arrays。如果不存在,您将浪费更多时间寻找解决方案而不是自己解决问题
  • 您可以查看 Guava 及其nullsLast 订购。我不确定您是否可以在不同时以任何方式对集合进行排序的情况下使用它,所以它可能不是那么简洁的解决方案。

标签: java arrays


【解决方案1】:

使用Arrays.sort(T[],Comparator) 并传递 Comparator 以根据您自己的逻辑进行排序。

在此处阅读更多内容并找到示例代码


这是对数组进行排序的示例代码,同时最终推送null 值。

注意:(根据您的需要更改它,未经过全面测试

    final Integer[] data = new Integer[] { null, null, 3, 4, null };
    Arrays.sort(data, new Comparator<Integer>() {
        public int compare(Integer o1, Integer o2) {
            if(o1 != null && o2!=null){
                return o1.compareTo(o2);
            }else if(o2 != null){
                return o2;
            }else{                  
                return Integer.MIN_VALUE; // null values in the end
            }
        }
    });

    System.out.println(Arrays.toString(data));

输出:

   [3, 4, null, null, null]

编辑

如果您只对最终移动 null 值感兴趣,请在以下帖子中找到由@Dmitry Ginzburg 回答的示例代码

【讨论】:

  • [null, null, 4, 3, null] 上此代码将返回[3, 4, null, null, null],这是不正确的。
  • @DmitryGinzburg 期望什么?
  • @Braj [4, 3, null, null, null]
  • @Braj 我稍微采纳了你的解决方案。你能检查一下吗(现在这是问题的一部分)?
  • @kharandziuk 我会测试它。
【解决方案2】:

Java 标准库中的sort 算法是稳定的,因此,如果我们使不为 null 的元素相同(在排序的上下文中),它将保持顺序:

Arrays.sort(data, new Comparator<Integer>() {
    public int compare (Integer x1, Integer x2) {
        if (x1 == null && x2 != null)
            return 1;
        else if (x1 != null && x2 == null)
            return -1;
        else
            return 0;
    }
});

【讨论】:

  • 结果不正确。我测试了您的输入代码[null, null, 3, 4, 2, null] 和输出[3, 4, 2, null, null, null]
  • 您的代码是正确的,但 Braj 之前提供了一个想法。谢谢!
  • @DmitryGinzburg 抱歉,我用错了方式。我也是从排序的角度思考的。根据排序逻辑,它应该是 []2, 3, 4, null, null, null] 但我错了。我认为 OP 只是想移动项目而不是对排序感兴趣。
  • @Braj,是的,这确实是 OP 要求的。
猜你喜欢
  • 2014-07-18
  • 1970-01-01
  • 2014-08-07
  • 2019-11-14
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
相关资源
最近更新 更多