Skip to content

Instantly share code, notes, and snippets.

@besstiolle besstiolle/testNumber.java
Last active Dec 31, 2015

Embed
What would you like to do?
Testons les différentes manières de détecter si une chaine de caractère est un entier positif. Exemple également avec un entier positif ou négatif + d'info sur http://www.furie.be/news/48/15/Comment-tester-un-numerique-dans-Java.html
package be.furie.example;
import java.util.regex.Pattern;
public class testNumber {
private static final Pattern PATTERN_INTEGER = Pattern.compile("[0-9]+");
private static final int NUM_ELT = 1000000;
private static String[] gen = new String[NUM_ELT];
private static void initGenerateInt(int ratioLetter) {
String car = "";
for (int i = 0; i < NUM_ELT; i++) {
car = "";
if (i % ratioLetter == 0) {
car = "a";
}
gen[i] = "" + Math.round(Math.random() * 100 - 50) + car;
}
}
private static boolean isIntegerByBytes(String val) {
byte[] bytes = val.getBytes();
for (int i = 0; i < bytes.length; i++) {
if (!Character.isDigit((char) bytes[i])) {
return false;
}
}
return true;
}
private static boolean isIntegerRegEx(String val) {
return PATTERN_INTEGER.matcher(val).matches();
}
private static boolean isIntegerException(String val) {
try {
Integer.valueOf(val);
return !val.startsWith("-");
} catch (NumberFormatException e) {
return false;
}
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("TEST avec zero lettre ");
run(1000000);
System.out.println("TEST avec 1 lettre par 1000 lignes");
run(1000);
System.out.println("TEST avec 1 lettre par 10 lignes");
run(10);
System.out.println("TEST avec 1 lettre par 5 lignes");
run(5);
System.out.println("TEST avec 1 lettre par 4 lignes");
run(4);
System.out.println("TEST avec 1 lettre par 3 lignes");
run(3);
System.out.println("TEST avec 1 lettre par 2 lignes");
run(2);
System.out.println("TEST avec 1 lettre par ligne");
run(1);
}
private static void run(int numElt) {
initGenerateInt(numElt);
long start = System.currentTimeMillis();
int cpt = 0;
for (int i = 0; i < NUM_ELT; i++) {
if (isIntegerRegEx(gen[i])) {
cpt++;
}
}
System.out.println(" > RegEx : " + (System.currentTimeMillis() - start) + " ms avec " + cpt + " nombres positif");
start = System.currentTimeMillis();
cpt = 0;
for (int i = 0; i < NUM_ELT; i++) {
if (isIntegerException(gen[i])) {
cpt++;
}
}
System.out.println(" > Exception : " + (System.currentTimeMillis() - start) + " ms avec " + cpt + " nombres positif");
start = System.currentTimeMillis();
cpt = 0;
for (int i = 0; i < NUM_ELT; i++) {
if (isIntegerByBytes(gen[i])) {
cpt++;
}
}
System.out.println(" > ByBytes : " + (System.currentTimeMillis() - start) + " ms avec " + cpt + " nombres positif");
}
}
package be.furie.example;
import java.util.regex.Pattern;
public class testNumber2 {
private static final Pattern PATTERN_INTEGER = Pattern.compile("\\-?[0-9]+");
private static final int NUM_ELT = 1000000;
private static String[] gen = new String[NUM_ELT];
private static void initGenerateInt(int ratioLetter) {
String car = "";
for (int i = 0; i < NUM_ELT; i++) {
car = "";
if (i % ratioLetter == 0) {
car = "a";
}
gen[i] = "" + Math.round(Math.random() * 100 - 50) + car;
}
}
// http://www.developpez.net/forums/d483247/java/general-java/langage/verifier-qu-nombre-entier-java/#post2907422
private static boolean isIntegerByBytes(String val) {
byte[] bytes = val.getBytes();
for (int i = 0; i < bytes.length; i++) {
if (!Character.isDigit((char) bytes[i])) {
if (i == 0 && '-' == (char) bytes[i]) {
continue;
}
return false;
}
}
return true;
}
private static boolean isIntegerRegEx(String val) {
return PATTERN_INTEGER.matcher(val).matches();
}
private static boolean isIntegerException(String val) {
try {
Integer.valueOf(val);
return true;
} catch (NumberFormatException e) {
return false;
}
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("TEST avec zero lettre ");
run(1000000);
System.out.println("TEST avec 1 lettre par 1000 lignes");
run(1000);
System.out.println("TEST avec 1 lettre par 10 lignes");
run(10);
System.out.println("TEST avec 1 lettre par 5 lignes");
run(5);
System.out.println("TEST avec 1 lettre par 4 lignes");
run(4);
System.out.println("TEST avec 1 lettre par 3 lignes");
run(3);
System.out.println("TEST avec 1 lettre par 2 lignes");
run(2);
System.out.println("TEST avec 1 lettre par ligne");
run(1);
}
private static void run(int numElt) {
initGenerateInt(numElt);
long start = System.currentTimeMillis();
int cpt = 0;
for (int i = 0; i < NUM_ELT; i++) {
if (isIntegerRegEx(gen[i])) {
cpt++;
}
}
System.out.println(" > RegEx : " + (System.currentTimeMillis() - start) + " ms avec " + cpt + " nombres positif");
start = System.currentTimeMillis();
cpt = 0;
for (int i = 0; i < NUM_ELT; i++) {
if (isIntegerException(gen[i])) {
cpt++;
}
}
System.out.println(" > Exception : " + (System.currentTimeMillis() - start) + " ms avec " + cpt + " nombres positif");
start = System.currentTimeMillis();
cpt = 0;
for (int i = 0; i < NUM_ELT; i++) {
if (isIntegerByBytes(gen[i])) {
cpt++;
}
}
System.out.println(" > ByBytes : " + (System.currentTimeMillis() - start) + " ms avec " + cpt + " nombres positif");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.