2015-01-12 5 views
5

Поэтому я много думал о логике оператора if if в строке 6 моего кода. Но я надеялся получить некоторые отзывы от более опытных разработчиков. Вы, ребята, думаете, что я просто перепутал свой код, и если да, то как бы вы написали это более кратким?рекомендации по созданию кода для строковых манипуляций

enter image description here

+3

проверить это http://www.tutorialspoint.com/java/java_string_startswith.htm –

+2

Просто совет: пожалуйста, напишите код, а не только его образ. Наличие фактического текста облегчает вам помощь (менее значительная часть здесь, так как она небольшая, но только изображение является головной болью для больших фрагментов кода), а также делает текст доступным для поиска. –

ответ

8

Over-усложнению? Да, вы на самом деле :-)

Я бы просто использовать гораздо проще:

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

Отличное объяснение .. Я видел, что startWith() естественно возвращает логическое значение, я не понимал, что вы все равно можете вернуть строку из этого, но имеет смысл, что вы можете, основываясь на результате, являющемся истинным или ложным. Также я думаю, что последний фрагмент кода с каждым циклом является гениальным для практичности в будущем использовании. Спасибо чувак! – 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 Второй блок if 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, поэтому я предполагаю, что это работает, потому что вы сделали его Array of, String [] приемлемым цветом. Тем не менее, я хочу лучше понять ваш .fliter() и с какой целью double :: предоставлять. Я просматриваю документы java 8 по этим последним 3 методам обработки после .stream(), но не могу их найти. – 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 ""; 
} 
Смежные вопросы