2013-07-29 19 views
30

voglio restituire il numero fintanto che rientra in un limite, altrimenti restituire il valore massimo o minimo del limite. Posso farlo con una combinazione di Math.min e Math.max.Java - numero limite tra min e max

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

Mi chiedo se c'è un limit o range funzione esistente sto con vista.
3rd librerie festa di benvenuto se sono piuttosto comuni (ad esempio: Comuni o Guava)

+0

Perché è necessario se 'Math.min'' Math.max' fornisce la soluzione? – Robadob

+4

Questo è il modello appropriato.Se lo si fa in molti punti, basta definire il proprio metodo in una classe helper –

+3

Se questo codice sembra troppo lungo, basta avvolgerlo nella propria funzione: –

risposta

3

A partire dalla versione 21, Guava include Ints.constrainToRange() (e metodi equivalenti per gli altri primitivi). Dalla release notes:

aggiunti constrainToRange([type] value, [type] min, [type] max) metodi che limitano il valore dato l'intervallo chiuso definito dai valori min e max. Tornano il valore stesso se è all'interno della gamma, il min se è al di sotto del range e il max se è al di sopra della gamma.

Copiato da https://stackoverflow.com/a/42968254/122441 da @ dimo414.

Purtroppo questa versione è abbastanza recente a partire da luglio 2017 e in alcuni progetti (vedere https://stackoverflow.com/a/40691831/122441) Guava ha interrotto la compatibilità con le versioni precedenti che richiedeva di rimanere nella versione 19 per ora. Sono anche scioccato dal fatto che né Commons Lang né Commons Math ce l'abbiano! :(

-2

Non hai bisogno di una libreria esterna per questo, provate questo test case:

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; 
} 

}

+0

Siamo spiacenti, non sto cercando un generatore di numeri casuali. Sto solo cercando di semplificare la dichiarazione che ho fornito in una singola operazione per una più facile leggibilità. –

+0

@SeanConnolly La confusione è che la tua affermazione dice _ "Voglio restituire un numero compreso tra un limite definito" _ che a più sembrerebbe generazione di numeri casuali. Penso che quello che intendi sia più simile a "Voglio restituire un numero finché cade con un limite, altrimenti restituire il valore massimo o minimo del limite" _ – chancea

+0

Accetto, ho aggiornato la domanda. Saluti @chancea. –

18

OP chiede questa implementazione in una libreria standard:

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); 
} 

un vero peccato la libreria standard per la matematica manca questi

+1

Inoltre, le lingue basate su C mancano l'ovvio idioma '(min <= valore < = max) ', molto per la costernazione dei neofiti. –

+2

Penso che sureRange dovrebbe essere un altro modo: 'int ensureRange (int value, intmin, intmax) { return Math.min (Math.max (value, min), max); } Questa è una buona ragione per averla in una biblioteca. Quindi puoi sbagliare solo una volta ;-) –

+0

@RensoLohuis Trivial: volevo eseguire 'min' prima di' max'. Leggi l'ordine! = Ordine di esecuzione. –

3

La funzione Math.max(int a, int b) è definita come:

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

modo da poter fare una combinazione dei max e min funzioni come segue:

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

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

metodo generico per qualsiasi classe che implementa Comparable (compresi Number e le sue sottoclassi):

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; 
} 

L'unico requisito è che tutti argomenti devono essere della stessa classe. Previene la possibile perdita di conversione del tipo. In realtà non è corretto confrontare float con double di long con int ecc. Ad esempio (double) 0.1 != (float) 0.1.

Usage:

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

Purtroppo è impossibile cambiare il primo argomento direttamente dal proprio limit(x, 12.0, 13.0) perché i tipi primitivi sono immutabili.