数组偶数和奇数排序

5

我有一个包含一些数字的数组。现在我想将偶数和奇数分别排序到两个不同的数组中。是否有相应的API可以实现这个功能?我尝试了以下代码:

int[] array_sort={5,12,3,21,8,7,19,102,201};
int [] even_sort;
int i;
for(i=0;i<8;i++)
{

if(array_sort[i]%2==0)
{
     even_sort=Arrays.sort(array_sort[i]);//error in sort
        
System.out.println(even_sort);
}
}

你尝试了什么?创建两个不同的数组,一个包含奇数,另一个包含偶数,对这两个数组进行排序。如果你说的是一百万个数字,那么空间开销确实有点大。 - Jayan
8个回答

11

简单明了。

int[] array_sort = {5, 12, 3, 21, 8, 7, 19, 102, 201 };

List<Integer> odd = new ArrayList<Integer>();
List<Integer> even = new ArrayList<Integer>();
for (int i : array_sort) {
    if ((i & 1) == 1) {
        odd.add(i);
    } else {
        even.add(i);
    }
}
Collections.sort(odd);
Collections.sort(even);
System.out.println("Odd:" + odd);
System.out.println("Even:" + even);

非常简单明了。+1 :) - Chankey Pathak

3

您提出的问题不太明确,代码也不正确。因此,我猜测您想将数组元素分成两个数组,一个包含奇数,另一个包含偶数。如果是这样,请按照以下方式执行:

int[] input = {5, 12, 3, 21, 8, 7, 19, 102, 201};
List<Integer> evens = new ArrayList<Integer>();
List<Integer> odds = new ArrayList<Integer>();
for (int i : input) {
    if (i % 2 == 0) {
        evens.add(i);
    } else {
        odds.add(i);
    }
}

如果int类型的列表,您可以按照以下方式将其转换为排序数组:
List<Integer> list ...
int[] array = new int[list.size()];
for (int i = 0; i < array.length; i++) {
    array[i] = list.get(i);
}
Arrays.sort(array);

如果你需要一个已排序的 List<Integer>,只需执行以下操作:

Collections.sort(list);

2
使用Guava很容易实现此操作。
  • 使用Ints.asList创建一个List<Integer>,它是int[]的动态视图。
  • 定义一个Function<Integer,Boolean> isOdd
  • 使用比较onResultOf(isOdd)Ordering,自然排序(即先false,然后true
  • 必要时,将其与Ordering.natural()结合使用compound
这是代码片段:
    int[] nums = {5,12,3,21,8,7,19,102,201};
    Function<Integer,Boolean> isOdd = new Function<Integer,Boolean>() {
        @Override
        public Boolean apply(Integer i) {
            return (i & 1) == 1;
        }
    };
    Collections.sort(
        Ints.asList(nums),
        Ordering.natural().onResultOf(isOdd)
            .compound(Ordering.natural())
    );
    System.out.println(Arrays.toString(nums));
    // [8, 12, 102, 3, 5, 7, 19, 21, 201]

请注意,所有偶数先出现,然后是所有奇数。在每个组内,数字按自然顺序排序。

外部链接


1

首先需要了解以下几点:

  • 在使用数组之前,必须对其进行初始化。例如:int[] even_sort = new int[3];
  • 在Java中,数组具有静态大小。这意味着您无法添加任意数量的元素。您必须先选择一个大小。您应该看一下Java集合,这是摆脱这种“规则”的好方法。
  • Arrays.sort() 方法仅适用于数组。这里的 array_sort[i] 是一个 int
  • Arrays.sort() 对数组进行排序,但不返回任何内容。

如果你真的想使用数组(但你不应该这样做),你可以像这样调整大小:

int[] even_sort = new int[3]{1, 2, 3};
int[] temp = new int[4];
System.arraycopy(even_sort, 0, temp, 0, even_sort.length);
even_sort = temp;
even_sort[3] = 4;

另一种方法是创建一个实用方法,该方法使用反射来创建新数组:

import java.lang.reflect.Array;

public Object resizeArray(Object originalArray, int newSize){
    int originalSize = Array.getLength(originalArray);
    Class arrayType = originalArray.getClass().getComponentType();
    Object newArray = Array.newInstance(arrayType, newSize);
    System.arraycopy(originalArray, 0, newArray, 0, Math.min(originalSize, newSize));
    return newArray;
}

如果你仍然因为某些原因想要使用数组(但你仍然不应该这样做),这里有一段代码可以过滤、调整大小和排序你的数组。

int[] arrayToFilterAndSort = {5, 12, 3, 21, 8, 7, 19, 102, 201};
int[] sortedEvens = new int[0];
for(int current : arrayToFilterAndSort){
    if((current & 1) == 1){
        sortedEvens = resizeArray(sortedEvens, sortedEvens.length + 1);
        sortedEvens[sortedEvens.length - 1] = current;
    }
}
Arrays.sort(sortedEvens);

资源:


1
package com.java.util.collection;

import java.util.Arrays;

/**
 * Given n random numbers. Move all even numbers on left hand side and odd numbers on right hand side and 
 * then sort the even numbers in increasing order and odd numbers in decreasing order For example, 
 * i/p : 3 6 9 2 4 10 34 21 5 
 * o/p: 2 4 6 10 34 3 5 9 21
 * @author vsinha
 *
 */
public class EvenOddSorting {

    public static void eventOddSort(int[] arr) {
        int i =0;
        int j =arr.length-1;
        while(i<j) {
            if(isEven(arr[i]) && isOdd(arr[j])) {
                i++;
                j--;
            } else if(!isEven(arr[i]) && !isOdd(arr[j])) {
                swap(i,j,arr);
            } else if(isEven(arr[i])){
                i++;
            } else{
                j--;
            }

        }   
        display(arr);
        // even number sorting
        Arrays.sort(arr,0,i);
        Arrays.sort(arr,i,arr.length);
        // odd number sorting
        display(arr);

    }

    public static void display(int[] arr) {
        System.out.println("\n");
        for(int val:arr){
            System.out.print(val +"  ");
        }
    }

    private static void swap(int pos1, int pos2, int[] arr) {
        int temp = arr[pos1];
        arr[pos1]= arr[pos2];
        arr[pos2]= temp;
    }

    public static boolean isOdd(int i) {
        return (i & 1) != 0;
    }
    public static boolean isEven(int i) {
        return (i & 1) == 0;
    }
    public static void main(String[] args) {
        int arr[]={3, 6, 9 ,2, 4, 10, 34, 21, 5};
        eventOddSort(arr);
    }
}

0
int arr[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cout << "The Even no are : \n";
for (int i = 1; i <= 10; i++) // for start for only i....(even nos)
{
    if (i % 2 == 0)
    {
        cout << i;
        cout << " ";
    }
}
cout << "\nThe Odd no are : \n";
for (int j = 1; j <= 10; j++) // for start for only j....(odd nos)
{
    if (j % 2 != 0)
    {
        cout << j;
        cout << " ";
    }`enter code here`
}

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

-2
package srikanth dukuntla;

public class ArrangingArray {

    public static void main(String[] args) {
        int j=0;
        int []array={1,2,3,5,4,55,32,0};
        System.out.println(array.length);
        int n=array.length/2;
        for (int i=0; i<array.length; i++){

            if(array[i]%2!=0){
                j=1;

                int temp=array[array.length-j];
            if(temp % 2!=0){

                while((array[array.length-(j+1)]%2!=0) && (array.length-(j+1)>n)){
                        j++;
                }
                    int temp2=array[array.length-(j+1)];
                     array[array.length-(j+1)] =array[i];
                      array[i]=temp2;

                }else // inner if
                {
                 array[array.length-j] =array[i];
                  array[i]=temp;
                }

            }else //main if
            {
                //nothing needed

            }

        }

        for(int k=0;k<array.length;k++) {
            System.out.print(" "+ array[k]);
        }

    }

}

1
虽然这段代码可能回答了问题,但最好包含一些上下文,解释它的工作原理以及何时使用它。仅有代码的答案从长远来看并不有用。 - spongebob
也因无效的包名而无法编译。 - Dave Newton

-2
List < Integer > odd = new ArrayList < Integer > ();

List < Integer > even = new ArrayList < Integer > ();

int a [] = {0,2,3,98,1,6546,45323,1134564};

int i;
for (i = 0; i < a.length; i++) {

    if (a[i] % 2 == 0) {

        even.add(a[i]);

    } else {

        odd.add(a[i]);

    }
}

System.out.print("Even: " + even + "\n");
System.out.print("Uneven: " + odd + "\n");
}
}

这似乎与半个十年前的答案基本相同 - 你能在你的答案中解释它相比之前的答案带来了什么额外的好处吗?请参见其他纯代码答案的评论。 - Dave Newton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接