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

如何使用Java根据3的倍数对数组进行排序

胡野
2023-03-14

我有一个这样的数组-

{1, 2, 3, 4, 5, 6}

我想按3的倍数和余数0、1和2的顺序排序。(第一组是3的倍数,第二组是3的倍数和余数1,最后一组是3的倍数和余数2),我想保留元素在数组中出现的顺序。结果应该是{3,6,1,4,2,5}

我有这个密码-

int current = 0;
int b = 0;
for (int i = 0; i < 3; i++) { //3 groups
    for (int j = current; j < numbers.length; j++) {
        if (numbers[j] % 3 == i) { //reminder should be 0,1 or 2
            b = numbers[j];
            numbers[j] = numbers[current];
            numbers[current] = b;
            current++;
        }
    }
}

但这段代码并没有保留元素在数组中出现的顺序。我得到的结果是-

{3, 6, 1, 4, 5, 2}

但是我希望结果是像{3, 6, 1, 4, 2, 5}这样的,怎么才能实现这个呢?

共有3个答案

欧阳睿范
2023-03-14

我将创建一个相同大小的新数组,然后将元素按正确的顺序放置。例如:

int[] array = {1, 2, 3, 4, 5, 6};
int[] sorted = new int[array.length];
int counter = 0;
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < array.length; j++) {
        if (array[j] % 3 == i) {
            sorted[counter] = array[j];
            counter++;
        }
    }
}
System.out.println(Arrays.toString(sorted));

输出:

[3, 6, 1, 4, 2, 5]

或者,您可以使用Java 8功能来减少如下代码量:

int[] array = {1, 2, 3, 4, 5, 6};
int[] sorted = Arrays.stream(array).boxed().sorted(Comparator.comparingInt(a -> (a % 3))).mapToInt(i -> i).toArray();

输出:

[3, 6, 1, 4, 2, 5]
宋英杰
2023-03-14

您可以使用IntStreamComparator对流进行排序:

int[] arr = {1, 2, 3, 4, 5, 6};

int[] arrSorted = IntStream.of(arr).boxed()
        .sorted(Comparator.comparingInt(i -> i % 3))
        .mapToInt(Integer::intValue)
        .toArray();

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

输出:

[3, 6, 1, 4, 2, 5]

注:来自IntStream。of()javadoc:

返回其元素为指定值的顺序流。

王炜
2023-03-14

在您的解决方案中,您将在适当的位置交换元素,这会将它们从初始顺序中洗牌。这就是为什么你们最后没有相同的订单。我不确定除了使用第二个数组来保存已排序的元素,同时对原始数组进行迭代之外,是否还有其他方法:

public static void main(String[] args) {
    int[] numbers = new int[]{1, 2, 3, 4, 5, 6};
    int[] result = new int[numbers.length];
    int b = 0;
    int current = 0;
    for (int i = 0; i < 3; i++) { //3 groups
        for (int j = 0; j < numbers.length; j++) {
            if (numbers[j] % 3 == i) { //reminder should be 0,1 or 2
                result[current] = numbers[j];
                current++;
            }
        }
    }

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

输出:[3, 6, 1, 4, 2, 5]

 类似资料:
  • 问题内容: 考虑以下是我的数组 创建了它,就像下面的代码一样: 现在,我正在尝试根据字段进行排序。 所需输出: 关于Java&Gson,谁能以最好的方式帮助解决这个问题? 非常感谢您的投入。 问题答案: 首先,解析JSON的正确方法是创建一个类来封装数据,例如: 然后: 现在您有了一个,并且想要按属性的值对其进行排序,因此可以按照此处的说明使用: 最后:

  • 问题内容: 是否可以对看起来像这样的数组进行排序和重新排列: 匹配此数组的安排: 不幸的是,我没有任何要跟踪的ID。我将需要优先处理items-array,以使其尽可能接近sortingArr。 更新: 这是我正在寻找的输出: 任何想法如何做到这一点? 问题答案: 就像是: 这是一个较短的代码,但是会破坏数组:

  • 问题内容: 我在表中列出了用户列表。 活动用户应在非活动用户上方排序。 我正在尝试使用lodash 函数进行此操作,但未成功。 这里是如何的外观: 这是带有用户数组和sortBy loadsh函数代码的代码笔:https ://codepen.io/nikolatrajkovicq/pen/pGXdpM?editors = 1112 任何地方都欢迎。 问题答案: 您可以这样使用: 您可以只减去中的

  • 问题内容: 我有多个数组,我想根据其中一个的排序顺序对所有数组进行排序,如下所示: 我希望函数执行后,数组将如下所示: 问题答案: 您可以执行以下操作:首先根据键控数组的索引的索引对它们进行索引的值对它们进行排序,然后使用: 如果要在任何类型的集合上使它通用(但仍以与std lib集合算法相同的样式返回数组): 以及带有自定义比较器的版本:

  • 我有多个数组,我想根据其中一个数组的排序顺序对所有数组进行排序,如下所示: 我预计函数执行后的数组将如下所示:

  • 我正在尝试使用Java对由整数对字符串组成的数组进行排序 输入为: 所需的输出是: