2015-06-06 29 views
17

Tôi dường như không hiểu cách Integer.MAX_VALUEInteger.MIN_VALUE trợ giúp tìm giá trị nhỏ nhất và tối đa trong một mảng.Giải thích về Integer.MAX_VALUE và Integer.MIN_VALUE để tìm giá trị nhỏ nhất và tối đa trong một mảng

Tôi hiểu như thế nào phương pháp này (giả dưới đây) hoạt động khi tìm min và giá trị tối đa:

max = A[0], min = A[0] 
for each i in A 
    if A[i] > max then max = A[i] 
    if A[i] < min then min = A[i] 

Nhưng như đối với phương pháp này, tôi không hiểu mục đích của Integer.MAX_VALUEInteger.MIN_VALUE:

import java.util.Scanner; 

class MyClass { 

    public static void main(String[] args) { 

     int[] numbers; // declaring the data type of numbers 
     numbers = new int[3]; //assigning the number of values numbers will contain 
     int smallest = Integer.MAX_VALUE, largest = Integer.MIN_VALUE; 

     Scanner input = new Scanner(System.in); 

     System.out.println("Please enter 3 numbers"); 

     for(int counter = 0; counter<numbers.length;counter++) { 
      numbers[counter] = input.nextInt(); 
     } 

     for(int i = 0; i<numbers.length; i++) { 
      if(numbers[i]<smallest) 
       smallest = numbers[i]; 
      else if(numbers[i]>largest) 
       largest = numbers[i]; 
     } 

     System.out.println("Largest is "+largest); 
     System.out.println("Smallest is "+smallest); 
    } 

} 
  • System.out.println (Integer.MAX_VALUE) mang đến cho 2147483647
  • System.out.println (Integer.MIN_VALUE) g ives-2147483648

Vì vậy, mục đích nào Integer.MIN_VALUE và Integer.MIN_VALUE phân phối trong so sánh?

+0

Ý bạn là "cách"? Chúng là số, giống như bất kỳ số nào khác. Bạn so sánh chúng. – markspace

Trả lời

17

nhưng đối với phương pháp này, tôi không hiểu mục đích của Integer.MAX_VALUE và Integer.MIN_VALUE.

Bằng cách bắt đầu với smallest thiết lập để Integer.MAX_VALUElargest thiết lập để Integer.MIN_VALUE, họ không phải lo lắng sau về trường hợp đặc biệt nơi smallestlargest không có một giá trị được nêu ra. Nếu dữ liệu tôi xem xét có giá trị đầu tiên là 10 thì numbers[i]<smallest sẽ là đúng (vì 10<Integer.MAX_VALUE) và chúng tôi sẽ cập nhật smallest thành 10. Tương tự, numbers[i]>largest sẽ là true10>Integer.MIN_VALUE và chúng tôi sẽ cập nhật largest. Và cứ thế.

Tất nhiên, khi thực hiện việc này, bạn phải đảm bảo rằng bạn có ít nhất một giá trị trong dữ liệu bạn đang xem. Nếu không, bạn kết thúc bằng số điện thoại trong số smallestlargest.

+2

Cảm ơn, điều này rất hữu ích! – Tia

+0

Có nhưng sau min và max đã được gán một số giá trị – Tia

+1

@Diksha: Có, và vì vậy giá trị tiếp theo sẽ được kiểm tra đối với chúng. Nếu '5' là giá trị thứ hai trong ví dụ trên của tôi, ví dụ, nó sẽ thay đổi' nhỏ nhất' (vì '5 <10' là' true') nhưng không lớn nhất (vì '5> 10' là' false'). Sau đó, nếu giá trị thứ ba là '12', nó sẽ không thay đổi' nhỏ nhất' (vì '12 <5' là' false'), nhưng * sẽ * thay đổi 'lớn nhất' (vì' 12> 10' là 'đúng'). –

3

Bằng cách khởi tạo các giá trị tối thiểu/cực đại theo chiều ngược lại, bạn tránh bất kỳ trường hợp giá trị cạnh nào trong đầu vào: Hoặc là một trong số min/max là một trong những giá trị đó (trong trường hợp đầu vào chỉ bao gồm một trong các giá trị đó) hoặc tìm thấy min/max chính xác.

Cần lưu ý rằng các loại nguyên thủy phải có giá trị. Nếu bạn đã sử dụng Đối tượng (ví dụ: Integer), bạn có thể khởi tạo giá trị thành null và xử lý trường hợp đặc biệt đó cho lần so sánh đầu tiên, nhưng điều đó tạo ra mã phụ (không cần thiết). Tuy nhiên, bằng cách sử dụng các giá trị này, mã vòng lặp không cần phải lo lắng về trường hợp cạnh của lần so sánh đầu tiên.

Một giải pháp khác là đặt cả giá trị ban đầu thành giá trị đầu tiên của mảng đầu vào (không bao giờ là vấn đề - xem bên dưới) và lặp lại từ phần tử 2nd trở đi vì đây là trạng thái chính xác của min/max sau một lần lặp. Bạn cũng có thể lặp lại từ phần tử thứ nhất - nó sẽ không tạo ra sự khác biệt nào, ngoài việc thực hiện thêm một lần lặp (không cần thiết) trên phần tử đầu tiên.

Cách duy nhất để xử lý bằng không có kích thước bằng không là đơn giản: ném IllegalArgumentException, vì min/max không được xác định trong trường hợp này.

7

Thay vì khởi tạo biến có giá trị tùy ý (ví dụ int smallest = 9999, largest = 0) thì an toàn hơn để khởi tạo biến có giá trị lớn nhất và nhỏ nhất thể hiện bằng loại số đó (nghĩa là int smallest = Integer.MAX_VALUE, largest = Integer.MIN_VALUE).

Vì mảng nguyên của bạn không thể chứa giá trị lớn hơn Integer.MAX_VALUE và nhỏ hơn Integer.MIN_VALUE mã của bạn hoạt động trên tất cả các trường hợp cạnh.

Các vấn đề liên quan