Java одномерные массивы

#java #arrays

#java #массивы

Вопрос:

Введите целые числа от 1 до 50: 1 2 1 0
1 встречается 2 раза,
2 встречается 1 раз,
1 встречается 2 раза

Как я могу сделать, чтобы получить 1, встречается только 1 раз? Проблема заключается в том, что он печатается много раз.

 import java.util.Scanner;
public class ex3 {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int[] num = new int[100];
        int i = 0;
        System.out.print("Enter the integers between 1 and 50: ");
        num[i] = input.nextInt();
        while(num[i] != 0){
            i  ;
            num[i] = input.nextInt();
        }
        for(int j=0;j<i;j  ){
            int n = 0;
            for(int k=0;k<i;k  ){
                if(num[j] == num[k]){
                    n  ;
                }
            }

            System.out.println(num[j]   " occurs "   n   " times");
        }
    }
}
  

Отредактируйте этот код

Комментарии:

1. Что должен делать ваш код?

Ответ №1:

Попробуйте это (пояснения см. в комментариях к коду):

 import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        int[] num = new int[100];
        int i = 0;
        while (i < 100) { // Check if the array is already full
            System.out.print("Enter 0 to Exit or enter the integers between 1 and 50 (Input #"   (i   1)   ") : ");
            int value = input.nextInt();
            if (value == 0) {
                break;
            }
            if (value < 1 || value > 50) { // check if input is between 1 and 50
                System.out.println("Input is not between 1 and 50");
            } else {
                num[i] = value;
                System.out.println();
            }

            i  ;
        }
        System.out.println();
        System.out.println("Result: ");
        for (int j = 0; j < i; j  ) {
            int n = 0;
            boolean isAlreadyPrinted = false; // flag to check if will be printed or not
            for (int k = 0; k < i; k  ) {
                if (num[j] == num[k]) {
                    if (j > k) { // this means that the same value is already found and printed
                        isAlreadyPrinted = true;
                    }
                    n  ;
                }

            }

            if (!isAlreadyPrinted) {
                System.out.println(num[j]   " occurs "   n   " times");
            }
        }
    }

}
  

Ответ №2:

Проблема в вашем цикле for.

Вы не должны увеличивать значение j до i. Вот почему «1 встречается 2 раза» печатается дважды. Что вам нужно сделать, так это проверить, что значение определенного индекса массива было выполнено несколько раз перед выполнением части печати.

 public static<T> T[] subArray(T[] array, int beg, int end) {
    return Arrays.copyOfRange(array, beg, end   1);
}

public static boolean hasDuplicateValues (int[] array, int value )
{
    boolean result = false ; 
    int count = 0 ; 
    for (int i=0 ; i< array.length; i  )
    {
           if(array[i] == value)
           {
            count = count 1 ; 
           }

    }

    if(count > 1)
    {
      result = true; 
    }

   return resu< 
}

public static void main(String[] args)
{
 Scanner input = new Scanner(System.in);
     int[] num = new int[100];
     int i = 0;
     System.out.print("Enter the integers between 1 and 50: ");
     num[i] = input.nextInt();
    while(num[i] != 0){
        i  ;
        num[i] = input.nextInt();
    }
    for(int j=0;j<i;j  ){
        int n = 0;
        for(int k=0;k<i;k  ){
            if(num[j] == num[k]){
                n  ;
            }
        }


        int[] subarray = subArray(num, 0, i);
        boolean isDuplicate = hasDuplicateValues (subarray , num[i] )
    if(isDuplicate == false )
    { 
          System.out.println(num[j]   " occurs "   n   " times");
    }


    }



}