Как изменить значения, превышающие тип данных int, на тип данных long в этом коде?

В последней части этого кода (где last for loop и if операторы), я пытаюсь изменить тип integersданных longto, когда они превышают предел целочисленного типа данных. Что я делаю неправильно в этом коде? Когда я бегу, я получаю те же значения, что и до того, как я даже пытался изменить их на long (которые становятся все большими целыми числами, пока они не становятся отрицательными).

public class UniqueElements {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int maxValue = 0;
        int numElements = 0;
        int programRuns = 12;
        Scanner sc = new Scanner(System.in);
        for (int newExecution = 0; newExecution <= programRuns; newExecution++ ) {
            System.out.print("Enter the maximum value for an element: ");
            //prompt user to enter the maximum value
            maxValue = sc.nextInt(); //user input for max value
            System.out.print("Enter the number of elements in the array: ");
            numElements = sc.nextInt(); //number of elements in an array
            int A[] = new int[numElements];
            //array comprising of the number of elements chosen by the user
            int totalComp = 0; //set total comparisons to 0
            for (int runs = 1; runs <= 100; runs++) { //program runs 100 times
                Random rand = new Random(System.nanoTime());
                //initiate the random number generator
                int numComp = 0; //set number of comparisons to 0
                for (int index = 0; index < numElements; index++) { 
                    A[index] = rand.nextInt(maxValue); 
                    //length of array is the number of elements the user puts in
                }
                for (int i = 0; i < A.length; i++) { //for each integer in the array
                    for (int j = i + 1; j < A.length; j++) { 
                        //for each integer following i
                        if (A[i] == A[j]) { //if the are equal to eachother
                            //end the if statement
                            break;
                        }
                        if (numComp == (int)numComp) {
                           numComp++; 
                        }
                        else {
                            Long.valueOf(numComp);
                            numComp++;
                        }
                    }
                }
                totalComp+= numComp; 
            } //end 100 loops
            if (totalComp == (int)totalComp) 
                System.out.println("Average number of comparisons: " + totalComp / 100);
            else {
                System.out.println("Average number of comparisons: " + 
                                    Long.valueOf(totalComp) / 100L);
            }

            }
        }
    }

2 ответа

  1. обновление:

    как-то…. изменение общего числа запусков на 2 и деление переменной totalComp на 2 и 2L заставило его работать. Кто-нибудь знает, как это изменило его?

  2. Невозможно изменить тип переменной после ее объявления. Вы можете привести эту переменную к другому типу или «интерпретировать» ее как другой тип (как в вашемLong.valueOf()), но переменная по-прежнему остается тем типом, который вы объявили.

    В вашем коде вы объявилиtotalComp, что являетесь anint, что в Java означает, что он содержит 32 бита (один из которых является знаковым битом). Невозможно сделать так, чтобы Java хранил более 32 бит в int. Если вы продолжите добавлять Integer.MAX_VALUEили вычитать значение нижеInteger.MIN_VALUE, значение в переменной будет просто под / overflow. Таким образом, это утверждение после вашего цикла for не делает то, что вы ожидаете, и всегда будет истинным: if (totalComp == (int)totalComp)

    Другими словами, вы не можете вернуться «назад во времени» и повторно объявить примитив intкак along, потому что вы обнаружили во время выполнения, что вам нужно хранить большие значения. Самый простой способ решить эту проблему — объявить totalCompа long. Если по какой-то причине вы не можете изменить тип totalComp, то можно обнаружить переполнение/underflow перед выполнением расчета; смотрите этот ответ для получения дополнительной информации.