読みやすさと保守性とパフォーマンスが必要な場合、ソリューションは異なります。投稿されたすべての回答をテストし、基本的な実装を試した後、最高のパフォーマンスは基本的な実装でした。これはより多くのコードですが、役に立つかもしれません:
public interface IEvaluable {
void evaluate();
}
public class BasicImplementation implements IEvaluable {
private String string;
public BasicImplementation(String string) {
this.string = string;
}
//using the power of shadowing
public String[] getDigitsAsArray(String string) {
String[] data = new String[string.length()];
int j = 0;
for(int i = 0; i < string.length(); i++) {
if (Character.isDigit(string.charAt(i))) {
data[j++] = Character.toString(string.charAt(i));
}
}
String[] realData = new String[j];
for(int i = 0;i < j ;i++) {
realData[i] = data[i];
}
return realData;
}
@Override
public void evaluate() {
getDigitsByArray(string);
}
}
回答のパフォーマンスをテストするために、結果をテストする方法を実装しました。
public final class PerformanceEvaluator {
private IEvaluable evaluable;
public PerformanceEvaluator(IEvaluable evaluable) {
this.evaluable = evaluable;
}
public void evaluate() {
long initialTime;
long endTime;
initialTime = System.nanoTime();
try {
evaluable.evaluate();
} catch (Exception e) {
e.printStackTrace(System.out);
}
endTime = System.nanoTime();
System.out.println("Ellapsed time: " + (endTime - initialTime));
}
}
そしてメインクラス
public class Main {
public static void main(String[] args) {
Main oMain = new Main();
oMain.evaluate("12");
oMain.evaluate("123456789098_)(56765432145");
oMain.evaluate("wbfiwyfwbn74g0t3h7t394mhg983hhon504n0er0n");
oMain.evaluate(
"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890");
oMain.evaluate("no digits");
}
public void evaluate(String string) {
PerformanceEvaluator performanceEvaluator =
new PerformanceEvaluator(new BasicImplementation(string));
performanceEvaluator.evaluate();
}
}
IEvaluable
提供されたソリューションとのインターフェースを実装する他のクラスを作成し、自分でテストしてください。テストは、Ubuntu 12.04 LT 上の 8 GB RAM を搭載した Intel® Core™ i7-2675QM CPU @ 2.20GHz × 8 上の Java 1.7.0_09 HotSpot 64 ビット サーバー VM で行われました。
これらのテストケースだけに基づく私の意見では:
- 正規表現を使用してパフォーマンスを優先する場合は、@BlueBullet の回答を選択してください。
- に固執したい場合は
String#split
、@Pshemoの回答を選択してください。