বিদ্যমান উত্তরগুলি বিবেচনা করে, আমি Integer.parseInt
কাজটি করার জন্য, এবং আমার সমাধানটির কপি-পেস্ট এবং বর্ধিত উত্স কোডটি করেছি
- সম্ভাব্য ধীর চেষ্টা করে না ( ল্যাং 3 নম্বর ইউটিলের বিপরীতে ),
- রিজেক্সপস ব্যবহার করে না যা খুব বেশি সংখ্যক ধরতে পারে না,
- বক্সিং এড়ানো (পেয়ারা থেকে পৃথক
Ints.tryParse()
),
- (অসদৃশ কোনো বরাদ্দ প্রয়োজন হয় না
int[]
, Box
, OptionalInt
),
CharSequence
সম্পূর্ণর পরিবর্তে এর যে কোনও বা কোনও অংশ গ্রহণ করে String
,
- যে কোনও মূলক ব্যবহার করতে
Integer.parseInt
পারে, যা [২,৩ 2,],
- কোনও লাইব্রেরির উপর নির্ভর করে না।
একমাত্র ক্ষতি হ'ল toIntOfDefault("-1", -1)
এবং এর মধ্যে কোনও পার্থক্য নেই toIntOrDefault("oops", -1)
।
public static int toIntOrDefault(CharSequence s, int def) {
return toIntOrDefault0(s, 0, s.length(), 10, def);
}
public static int toIntOrDefault(CharSequence s, int def, int radix) {
radixCheck(radix);
return toIntOrDefault0(s, 0, s.length(), radix, def);
}
public static int toIntOrDefault(CharSequence s, int start, int endExclusive, int def) {
boundsCheck(start, endExclusive, s.length());
return toIntOrDefault0(s, start, endExclusive, 10, def);
}
public static int toIntOrDefault(CharSequence s, int start, int endExclusive, int radix, int def) {
radixCheck(radix);
boundsCheck(start, endExclusive, s.length());
return toIntOrDefault0(s, start, endExclusive, radix, def);
}
private static int toIntOrDefault0(CharSequence s, int start, int endExclusive, int radix, int def) {
if (start == endExclusive) return def;
boolean negative = false;
int limit = -Integer.MAX_VALUE;
char firstChar = s.charAt(start);
if (firstChar < '0') {
if (firstChar == '-') {
negative = true;
limit = Integer.MIN_VALUE;
} else if (firstChar != '+') {
return def;
}
start++;
if (start == endExclusive) return def;
}
int multmin = limit / radix;
int result = 0;
while (start < endExclusive) {
int digit = Character.digit(s.charAt(start++), radix);
if (digit < 0 || result < multmin) return def;
result *= radix;
if (result < limit + digit) return def;
result -= digit;
}
return negative ? result : -result;
}
private static void radixCheck(int radix) {
if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
throw new NumberFormatException(
"radix=" + radix + " ∉ [" + Character.MIN_RADIX + "," + Character.MAX_RADIX + "]");
}
private static void boundsCheck(int start, int endExclusive, int len) {
if (start < 0 || start > len || start > endExclusive)
throw new IndexOutOfBoundsException("start=" + start + " ∉ [0, min(" + len + ", " + endExclusive + ")]");
if (endExclusive > len)
throw new IndexOutOfBoundsException("endExclusive=" + endExclusive + " > s.length=" + len);
}