2015-02-23 2 views
2

Итак, есть ли способ упростить это, чтобы сделать меньше в любом случае?если есть лучший способ написать это, если statment в java

else if(selectedCards.size() == 3 
      && cardAt(selectedCards.get(0)).pointValue() + cardAt(selectedCards.get(1)).pointValue() + cardAt(selectedCards.get(2)).pointValue() == 0 
      && !cardAt(selectedCards.get(0)).rank().equals(cardAt(selectedCards.get(1)).rank()) 
      && !cardAt(selectedCards.get(0)).rank().equals(cardAt(selectedCards.get(2)).rank()) 
      && !cardAt(selectedCards.get(1)).rank().equals(cardAt(selectedCards.get(2)).rank())) 
+2

вы можете сделать метод [обратный булево], чтобы уменьшить коды 'cardAt (selectedCards.get (0)) ранг() равно (cardAt (selectedCards.get (1)). Rank()) ' –

+1

Возможно, создайте функцию, которая выполняет эти проверки, назовите ее соответствующим образом и назовите ее в случае, если – beresfordt

+0

. Возьмите любой из нижеприведенных ответов, чтобы решить вашу проблему? Вам нужна дополнительная информация? Пожалуйста, подумайте о том, чтобы принять ответ, http://stackoverflow.com/help/someone-answers – Adam

ответ

3

Из того, что я вижу, вы пытаетесь проверить, имеют ли 3 карты разные ранги. Более простой способ проверить это - поместить их в набор и посмотреть, совпадает ли установленный размер с выбранным набором. Это весы для любого числа выбранных карт ...

public boolean differentRanks(List<Integer> selectedCards) { 
    Set<Integer> ranks = new HashSet<Integer>(); 
    for (int card : selectedCards) { 
     ranks.add(cardAt(card).rank()); 
    } 
    return ranks.size() == selectedCards.size(); 
} 

Я бы также создать метод Тотал очки для выбранных карт ...

public int sum(List<Integer> selectedCards) { 
    int total; 
    for (int card : selectedCards) { 
     total += cardAt(card).pointValue(); 
    } 
    return total; 
} 

Так что условие будет в конечном итоге

} else if (selectedCards.size() == 3 && sum(selectedCards) == 0 && 
      differentRanks(selectedCards) { 
0

Это будет один вариант:

else if(selectedCards.size() == 3 
     && cardAt(selectedCards.get(0)).pointValue() +  cardAt(selectedCards.get(1)).pointValue() + cardAt(selectedCards.get(2)).pointValue() == 0 
     && !(cardAt(selectedCards.get(0)).rank().equals(cardAt(selectedCards.get(1)).rank())).equals(cardAt(selectedCards.get(2)).rank())) 

Чтобы сделать более читаемым это условие вы могли бы сделать что-то вроде этого:

//here you extract the values you need only once and use them in your condition block below 
     int cardsSize = selectedCards.size(); 
     int pointValue0 = cardsSize == 3 ? cardAt(selectedCards.get(0)).pointValue() : 0; 
     int pointValue1 = cardsSize == 3 ? cardAt(selectedCards.get(1)).pointValue() : 0; 
     int pointValue2 = cardsSize == 3 ? cardAt(selectedCards.get(2)).pointValue() : 0;   
     bool rankEquals = CompareRanks(cardAt(selectedCards.get(0)),cardAt(selectedCards.get(1)),cardAt(selectedCards.get(2)); 

     if (<condition>) { 
      //block of sentences 
     } else if (cardsSize == 3 && (pointValue0 + pointValue1 + pointValue2) == 0 && !rankEquals) 

Я предлагаю создание функции, называемой «CompareRanks», где вы получите 3 различных объектов (результат «cardAt»), и вы получить ранг там и сравнить, если значения одинаковые или нет.

Эта опция приводит вас к большему количеству строк кода, но более чистая и удобная для чтения для любого человека, кроме вас.

0

На мой взгляд, наиболее читаемый:..

else if(selectedCards.size() == 3 && checkRanks(selectedCards)) 
{ 
    //... 
} 

//... 

private boolean checkRanks(List<Card> cards) 
{ 
    Card zeroCard = cardAt(selectedCards.get(0)); 
    Card firstCard = cardAt(selectedCards.get(1)); 
    Card secondCard = cardAt(selectedCards.get(2)); 

    boolean isZero = zeroCard.pointValue() + firstCard.pointValue() +  secondCard.pointValue() == 0; 

    boolean zeroCardRankNotEqualFirst = !zeroCard.rank().equals(firstCard.rank()) 
    boolean zeroCardRankNotEqualSecond = !zeroCard.rank().equals(secondCard.rank()) 
    boolean firstCardRankNotEqualsSecond = !firstCard.rank().equals(secondCard.rank()); 

    return isZero && zeroCardRankNotEqualFirst && zeroCardRankNotEqualSecond && firstCardRankNotEqualsSecond; 
} 
+0

Я бы просто хотел добавить, что читаемость - это то, что вам нужно больше всего беспокоиться. JVM будет компилировать и оптимизировать читаемый код в тот же набор инструкций, что и другие реализации, которые могут показаться более эффективными. Это, я думаю, это решение очень хорошо. – guyfleeman

Смежные вопросы