मैं कैसे जांच सकता हूं कि एक स्ट्रिंग लंबे, एक डबल, या सिर्फ एक नियमित स्ट्रिंग का प्रतिनिधित्व करती है या नहीं? मुझे ऐसा करने की ज़रूरत है क्योंकि इस मान को उसके प्रकार के अनुसार डेटाबेस में अनुक्रमित करने की आवश्यकता है। वर्तमान में मैं स्ट्रिंग को पार्स करने और अपवादों की जांच करने की कोशिश कर रहा हूं लेकिन चूंकि कोड को अक्सर बुलाया जाता है, इसलिए मुझे आश्चर्य है कि ऐसा करने का एक और अधिक प्रभावी तरीका है या नहीं। मेरे कोड वर्तमान में इस तरह दिखता है:कैसे जांचें कि स्ट्रिंग किस प्रकार और किस प्रकार की संख्या का प्रतिनिधित्व करती है?
String value = ...;
// For example, could be "213678", "654.1236781", or "qwerty12345"
try {
Long longValue = Long.parseLong(value);
// Index 'longValue' in the database
} catch (NumberFormatException parseLongException) {
try {
Double doubleValue = Double.parseDouble(value);
// Index 'doubleValue' in the database
} catch (NumberFormatException parseDoubleException) {
// Index 'value' in the database
}
}
संपादित करें:
मैं सिर्फ @ user949300 के सुझाव regex पैटर्न का उपयोग करने के प्रति के रूप में एक त्वरित बेंचमार्किंग व्यायाम किया था और यह ऊपर अपवाद हैंडलिंग कोड की तुलना में थोड़ा बेहतर प्रदर्शन किया। यहाँ किसी और मामले में किसी को कोड यह उपयोगी पाता है:
Pattern longPattern = Pattern.compile("^[-+]?[0-9]+$");
Pattern doublePattern = Pattern.compile("^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$");
// Check for long regex pattern before the double regex pattern
// since the former is a strict subset of the latter
if (longPattern.matcher(value).matches()) {
// Perform indexing for long in the database
} else if (doublePattern.matcher(value).matches()) {
// Perform indexing for double in the database
} else {
// Perform indexing for string in the database
}
यहाँ 50,000 प्रविष्टियों जहां प्रकार की अनुमानित टूटने 50% देशांतर है, 10% युगल, 40% तार जाँच (कार्यभार के प्रतिनिधि के लिए बेंच मार्किंग परिणाम हैं अपने आवेदन प्रक्रियाओं) कि:
--- Exception handling code ---
STRING - actual: 19861, found: 19861
DOUBLE - actual: 4942, found: 4942
LONG - actual: 25197, found: 25197
Time taken: 2561 ms
--- Regex pattern matching code ---
STRING - actual: 19861, found: 19861
DOUBLE - actual: 4942, found: 4942
LONG - actual: 25197, found: 25197
Time taken: 1565 ms
आप 'जावा 7' उपयोग कर रहे हैं की तुलना में ([बहु पकड़ने के ब्लॉक के लिए अपवाद] पर एक नज़र http://extreme-java.blogspot.com/2011/05/jdk-7 ले -multi-catch-block-for-upss.html) – RanRag
@RanRag मुझे नहीं लगता कि इस स्थिति में बहु-पकड़-ब्लॉक कितने उपयोगी हैं। दूसरा पकड़ अंदर है - बाद में नहीं - पहला पकड़ ब्लॉक। – emory
आप सही हैं मैंने इसे नहीं देखा है। – RanRag