2015-01-12 6 views
5

私のコードの6行目のif文のロジックには、たくさんの考えがあります。しかし、私は経験豊かな開発者からのフィードバックを得ることを望んでいました。皆さんは私のコードが複雑すぎると思っていますか?もしそうなら、あなたはこれをより簡潔に書いていますか?個人的に文字列操作に対するクリーナーコードの提案

enter image description here

+3

チェックこれをhttp://www.tutorialspoint.com/java/java_string_startswith.htm –

+2

だけヒント:コードを投稿し、それだけではなくイメージしてください。実際のテキストを持つことで、簡単に手助けすることができます(小さなものですからここで大きな違いはありませんが、画像だけを持つことは大きなコードでは頭痛です)。また、テキストを検索可能にします。 –

答えて

8

を好むでしょうか?はい、あなたは本当に私はずっと簡単に使用されるだろう:-)

です:

public String seeColor (String color) { 
    if (color.startsWith("red")) return "red"; 
    if (color.startsWith("blue")) return "blue"; 
    return ""; 
} 

次完全なプログラムを行動でそれを示しています

public class Test 
{ 
    public static String seeColor (String color) { 
     if (color.startsWith("red")) return "red"; 
     if (color.startsWith("blue")) return "blue"; 
     return ""; 
    } 

    public static void main(String[] args) { 
     String[] testData = { "redxx", "xxred", "blueTimes", "NoColor", 
      "red", "re", "blu", "blue", "a", "", "xyzred" }; 
     for (String s: testData) 
      System.out.println("[" + s + "] -> [" + seeColor(s) + "]"); 
    } 
} 

そのプログラムの存在の出力、予想通り:

[redxx] -> [red] 
[xxred] -> [] 
[blueTimes] -> [blue] 
[NoColor] -> [] 
[red] -> [red] 
[re] -> [] 
[blu] -> [] 
[blue] -> [blue] 
[a] -> [] 
[] -> [] 
[xyzred] -> [] 

あなたが将来的にそれが容易に拡張したい場合は、あなたのようなものを選ぶことができます:

その後
public static String seeColor (String color) { 
    String[] allow = {"red", "blue"}; 
    for (String s: allow) 
     if (color.startsWith(s)) 
      return s; 
    return ""; 
} 

allow配列に色を追加すると、あなたがそれを認識しているために取る必要がある唯一のステップです。

+0

大きな説明..私はstartsWith()が自然にブール値を返すのを見ましたが、私はあなたがそれから文字列を返すことはできなかったことを認識しませんでしたが、結果に基づいて、私は、各ループのためのコードの最後の部分は、将来の使用のための実用性のための天才だと思う。ありがとう! – user3646508

0

、私はあなたが

if (str != null) { 
    if (str.equals("red")) return "red"; 
    else if (str.equals("blue")) return "blue"; 
} 
return ""; 

または少し複雑switch

if (str != null) { 
    switch (str) { 
    case "red": 
     return "red"; 
    case "blue"; 
     return "blue"; 
    } 
} 
return ""; 

テストlengthようなもので、それを簡素化し、その後にsubstring()が表示されますを実行するかもしれないと思います比較的高価な多くを実行するString私に無意味な操作。

編集

あなただけの文字を開始し、テストする必要がある場合は、私は以上に複雑

if (str != null) { 
    if (str.startsWith("red")) return "red"; 
    else if (str.startsWith("blue")) return "blue"; 
} 
return ""; 
+0

これは "bluexx"のような入力を考慮していません。 – RogueBaneling

+0

@RogueBaneling OPの2番目の 'if'ブロックは、それを可能性として排除します。私は最初にチェックした。'length'は' 3'でなければならず、 '' red''や '' length''は '' 4''と '' blue'''と等しくなければなりません。 :) –

2

簡単に枝場合は、新規に追加するのではなく拡張することができるように、ストリームであなたの色の名前をカプセル化したほうが良いだろうと私には思える:

return Stream.of("red", "blue", "green") 
    .filter(colourName::startsWith).findAny().orElse(""); 

注このソリューションが依存していることJava 8ストリームとメソッド参照について

+0

Ooh、Java 8には新機能があります。 – paxdiablo

+0

解決策は大好きですが、私は構文があまり得意ではありません。このメソッドはString型の戻り値を持っているので、これをString、[] acceptableColoursのArrayにしたので、これがうまくいくと仮定します。しかし、私はあなたの.fliter()とdouble ::の目的をよりよく理解したいと思います。私は.stream()の後の最後の3つのメソッドでJava 8 Docsを見ていますが、それらを見つけることができません – user3646508

+1

.filterと.findAnyはSteamのメソッドです。 。orElseはオプションのメソッドです。 ::構文については、lamba式を見てください。 – sprinter

0

正規表現溶液。 ^は文字列の一致開始を意味します。

public static String GetColor(String input) { 
    String[] colors = {"red", "blue"}; 
    for(String color : colors) { 
     if(input.matches(String.format("^%s.*", color))) 
      return color; 
    } 
    return ""; 
}