Pertanyaan Java - nomor batas antara min dan maks


Saya ingin mengembalikan nomor tersebut selama itu masih dalam batas, yang lain mengembalikan nilai maksimum atau minimum dari batas. Saya bisa melakukan ini dengan kombinasi Math.min dan Math.max.

public int limit(int value) {
    return Math.max(0, Math.min(value, 10));
}

Saya ingin tahu apakah ada yang ada limit atau range fungsi saya menghadap.
Perpustakaan pihak ke-3 menyambut jika mereka cukup umum (misalnya: Commons atau Guava)


32
2017-07-29 20:23


asal


Jawaban:


Mulai dari versi 21, Jambu biji termasuk Ints.constrainToRange() (dan metode setara untuk primitif lainnya). Dari lepaskan catatan:

ditambahkan constrainToRange([type] value, [type] min, [type] max) metode yang membatasi nilai yang diberikan ke rentang tertutup yang ditentukan oleh min dan max nilai-nilai. Mereka mengembalikan nilai itu sendiri jika berada dalam jangkauan, min apakah itu di bawah jangkauan dan max jika di atas jangkauan.

Disalin dari https://stackoverflow.com/a/42968254/122441 oleh @ dimo414.

Sayangnya versi ini cukup baru mulai Juli 2017, dan di beberapa proyek (lihat https://stackoverflow.com/a/40691831/122441) Guava telah memecahkan kompatibilitas mundur yang mengharuskan saya untuk tetap menggunakan versi 19 untuk saat ini. Saya juga terkejut bahwa baik Commons Lang maupun Commons Math memilikinya! :(


5
2017-07-20 12:22



OP meminta penerapan ini di pustaka standar:

int ensureRange(int value, int min, int max) {
   return Math.min(Math.max(value, min), max);
}

boolean inRange(int value, int min, int max) {
   return (value>= min) && (value<= max);
}

Sayang sekali perpustakaan Matematika standar tidak memiliki ini


19
2018-03-31 08:59



Itu Math.max(int a, int b) fungsi didefinisikan sebagai:

public static int min(int a, int b) {
    return (a <= b) ? a : b;
}

Jadi Anda bisa membuat kombinasi dari max dan min berfungsi sebagai berikut:

private static int MAX=10;
private static int MIN=0;

public int limit(int a) {
    return (a > MAX) ? MAX : (a < MIN ? MIN: a );
}

3
2018-03-31 09:04



Metode umum untuk implementasi kelas apa pun Comparable (termasuk Number dan sub-kelasnya):

public static <T extends Comparable<? super T>> T limit(T o, T min, T max){
    if (o.compareTo(min) < 0) return min;
    if (o.compareTo(max) > 0) return max;
    return o;
}

Satu-satunya persyaratan adalah itu semua argumen harus dari kelas yang sama. Ini mencegah kemungkinan hilangnya konversi jenis.  Sebenarnya tidak benar untuk membandingkan float dengan double dari long dengan int dll. Misalnya (double) 0.1 != (float) 0.1.

Pemakaian:

double x = 13.000000001;
x = limit(x, 12.0, 13.0);
System.out.println("x = " + x); //x = 13.0

Sayangnya tidak mungkin mengubah argumen pertama secara langsung dengan adil limit(x, 12.0, 13.0) karena tipe primitif tidak dapat diubah.


2
2018-05-26 11:44



Jika Anda menggunakan Android, gunakan MathUtils (di pustaka pendukung), ia hanya memiliki satu fungsi yang secara khusus melakukan ini yang disebut penjepit.

Metode ini mengambil nilai numerik dan memastikannya sesuai dengan yang diberikan   rentang numerik. Jika jumlahnya lebih kecil dari minimum yang dibutuhkan oleh   rentang, maka rentang minimum akan dikembalikan. Jika itu   angka lebih tinggi dari maksimum yang diizinkan oleh rentang kemudian   maksimum rentang akan dikembalikan.


0
2018-04-03 20:55



Anda tidak memerlukan pustaka eksternal untuk ini, coba kasus uji ini:

public class RandomNumber {
public static void main(String[] Args) {
    System.out.println("random = " + randomInRange(5,10));
}

public static double randomInRange(double arg1, double arg2) {
    double my_number = Math.ceil(Math.random() * (arg1 - arg2) + arg2);
    return my_number;
 }

}


-2
2017-07-29 20:54