簡體   English   中英

在數組中顯示奇數值

[英]Displaying odd values in an array

我試圖在數組中顯示奇數,但每個數字僅顯示一次(即,numbers [3] = 3,3,1;僅顯示3和1而不是3、3和1。)

這是我到目前為止的代碼,該程序將完全創建一個具有用戶輸入的特定長度的,然后將計算數組中的最大最小值和奇數值。

import java.util.Scanner;

public class ArrayLab
{
static Scanner input = new Scanner (System.in);

public static void main(String[] args)
{
    System.out.println("Enter the number of numbers: ");
    final int NUMBER_OF_ELEMENTS = input.nextInt();

    double[] numbers = new double[NUMBER_OF_ELEMENTS];
    System.out.println("Enter the numbers: ");

    for (int i = 0; i < NUMBER_OF_ELEMENTS; i++)
    {
        numbers[i] = input.nextDouble();
    }
    input.close();

    double max = numbers[0];
    double min = numbers[0];

    for (int i = 0; i < NUMBER_OF_ELEMENTS; i++)
    {
        if (numbers[i] > max)
        {
            max = numbers[i];
        }
    }
    System.out.println("The max is: " + max);

    for (int i = 0; i < NUMBER_OF_ELEMENTS; i++)
    {
        if (numbers[i] < min)
        {
            min = numbers[i];
        }
    }
    System.out.println("The min is: " + min);

    for (int i = 0; i < NUMBER_OF_ELEMENTS; i++)
    {
        if (numbers[i] % 2 != 0)
        {
            System.out.println ("The odd numbers are: " + numbers[i]);
        }
    }

}

}

謝謝你的幫助。

Set<Integer> set = new HashSet<Integer>();
 for (int i = 0; i < NUMBER_OF_ELEMENTS; i++)
    {
     if (numbers[i] % 2 != 0)
        {
            set.add(numbers[i]);
        }
    }
System.out.println ("The odd numbers are: " +set);

使用Java8可以簡化很多工作:

double[] d = Arrays.toStream(numbers).filter(d -> (d % 2) == 1).distinct().toArray();

for(double tmp : d)
    System.out.println(tmp);

System.out.println("min: " + Arrays.toStream(numbers).min((a , b) -> new Double(a).compareTo(b)));

System.out.println("max: " + Arrays.toStream(numbers).max((a , b) -> (new Double(a).compareTo(b))));

對於您的解決方案:您永遠不會消除重復的數字,因此重復項會保留在數組中,直到您打印所有的奇數和最大數為止。

可以通過以下幾種方法消除這種情況:

  • 如上所述使用Java8
  • 將所有值添加到Set ,因為這些值不允許重復值
  • 以您自己的方式消除它們(我不會為此提供任何代碼,因為為此設計有效的解決方案相當復雜)

根據您的需要更新了解決方案。 並且請使用更好的編碼標准。 請注意,條件檢查!oddNumbers.contains(numbers [i])並不是非常必要,因為HashSet絕不使用任何重復的值。

import java.util.HashSet;
import java.util.Scanner;

public class ArrayLab {
static Scanner input = new Scanner(System.in);

public static void main(String[] args) {
    System.out.println("Enter the number of numbers: ");
    final int NUMBER_OF_ELEMENTS = input.nextInt();

    double[] numbers = new double[NUMBER_OF_ELEMENTS];
    System.out.println("Enter the numbers: ");

    for (int i = 0; i < NUMBER_OF_ELEMENTS; i++) {
        numbers[i] = input.nextDouble();
    }
    input.close();
    HashSet<Double> oddNumbers = new HashSet<Double>(NUMBER_OF_ELEMENTS);

    double max = numbers[0];
    double min = numbers[0];

    for (int i = 0; i < NUMBER_OF_ELEMENTS; i++) {
        if (numbers[i] > max) {
            max = numbers[i];
        }

        if (numbers[i] < min) {
            min = numbers[i];
        }

        if (numbers[i] % 2 != 0 && !oddNumbers.contains(numbers[i])) {
            oddNumbers.add(numbers[i]);
        }
    }
    System.out.println("The max is: " + max);
    System.out.println("The min is: " + min);
    System.out.println("The odd numbers are: " + oddNumbers);
}

}

對於您的方法,更有意義的解決方案如下:

int[] tempArray; //temporary array to store values from your original "array"
int count=0;
for(int i=0; i<numbers.length; i++) {
    if(numbers[i]%2 != 0) {
        count++;
    }
}
tempArray = new int[count]; //initializing array of size equals to number of odd digits in your array
int j = 0;
for(int i=0; i<numbers.length; i++) {
    boolean check = true;
    for(int k=0; k<j; k++) {
        if(tempArray[k] == numbers[i]) {
            check = false; //this will prevent duplication of odd numbers
        }
    }
    if(numbers[i]%2 != 0 && check) {
        tempArray[j]=numbers[i];
        j++;
    }
}
//Now print the tempArray which contains all the odd numbers without repetition

少數人提到了集合,但是還有另一種方式。 只需對數組進行排序,然后進行掃描,就最后一個打印出的數字進行檢查。

int lastPrinted = 0;

// Sort the array
Arrays.sort(numbers);

System.out.print("The odd numbers are: ");

// Scan through the array
for (int i = 0; i < NUMBER_OF_ELEMENTS; i++)
{
    // if it's odd and doesn't match the last one...
    if (numbers[i] % 2 != 0 && numbers[i] != lastPrinted)
    {
        // ...print it and update lastPrinted
        System.out.print( "" + numbers[i] );
        lastPrinted = numbers[i];
    }
}
System.out.println("");

附帶說明一下,您實際上不必遍歷整個陣列兩次即可找到最大值和最小值,您可以一口氣做到這一點。

我認為您可以使用內置的hashmap類及其方法來完成任務,而不會在很大程度上影響算法的復雜性。

import java.util.HashMap;

公共類散列{

public static void main(String[] args) {
    //declare a new hasmap
    HashMap<Integer, Integer> map = new HashMap<>();
    //consider Arr as your Array
    int Arr[] = {3,3,1,4,5,5,7,8};
    //traverse through the array
    for(int i=0;i<Arr.length;i++){
        //check if the required condition is true
        if(Arr[i]%2==1){
            /*now we insert the elements in the map but before
              that we have to make sure that we don't insert duplicate values*/
            if(!map.containsKey(Arr[i])){// this would not affect the complexity of Algorithm since we are using hashMap
                map.put(Arr[i], Arr[i]);//We are storing the Element as KEY and as VALUE in the map
            }
        }
    }
    //now We can get these element back from map by using the following statement
    Integer[] newArray = map.values().toArray(new Integer[0]);
    //All the required elements are now present in newArray
    for(int ele:newArray){
        System.out.println(ele);
    }
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM