首页 > 解决方案 > 在 Java 中重新排列数组以使所有元素彼此相邻

问题描述

我有一个元素数组,我正在尝试对其进行排列,以使数组中没有空空格。

例如,如果我有一个字符串数组...

String[] myArray = { "apple", null, "pen", "pineapple", null, "book" };

我希望数组中的元素彼此相邻,没有任何空位。

这是我的代码...

    String[] Array = {"apple","","pen","pineapple","", "book"};

    System.out.println("The array before:");
    for (int k = 0; k < Array.length; k++)
    {
        System.out.println(Array[k]);
    }

    for (int j = 0; j < Array.length; j++)
    {
        if (Array[j] == null)
        {
            Array[j] = Array[j + 1];
        }
    }

    System.out.println(" ");

    System.out.println("The array after:");
    for (int i = 0; i < Array.length; i++)
    {
        System.out.println(Array[i]);
    }

    /*The array before:
      apple
      null
      pen
      pineapple
      null
      book

      The array after:
      apple
      pen
      pen
      pineapple
      book
      book*/

标签: javaarrays

解决方案


我假设您要重新排列数组,以便空字符串出现在它的末尾。这类似于 Quicksort 使用的分区算法。我们可以通过维护数组的三个部分在一次线性扫描中对数组进行分区:非空字符串(在 的左侧firstEmpty)、空字符串(在firstEmpty和之间i)和未探索的(在 的右侧i)。

public static void main(String[] args) {
    String[] array = {"apple", "", "pen", "pineapple", "", "book"};

    int firstEmpty = 0;
    for (int i = 0; i < array.length; ++i) {
        if (!array[i].isEmpty()) {
            swap(array, firstEmpty, i);
            firstEmpty++;
        }
    }

    System.out.println(Arrays.toString(array));
}

private static void swap(final String[] array, final int i, final int j) {
    String tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
}

输出是

[apple, pen, pineapple, book, , ]

推荐阅读