2017-01-24 2 views
3

В некотором контексте: я разбираю бухгалтерскую книгу, которая имеет account1 и account2 как int. Каждый из них является числом в диапазоне [0, 99999]. У меня есть много комбинаций для рассмотрения.Включение пары `int`

В идеале я хотел бы использовать что-то вроде

switch (account1, account2){ 
    case (1,1): 
     /*account1 is 1, account2 is 1*/ 
    case (2,1): 
     /*account1 is 2, account2 is 1*/ 
} 

и так далее. (Мне нужно только рассмотреть около 20 возможных комбинаций).

Есть ли способ, которым я могу достичь этого на Java?

Я рассмотрел этот вопрос Storing number pairs in java

и мог построить IntPair класс. Возможно, если я определяю bool equals, тогда я мог бы switch на экземпляре, аналогичным образом, в котором вы можете включить java.lang.String.

+3

Невозможно. Переключатель использует предел amout типа (примитив и String). И только значение константы может быть задано в поле case. Но «if-else» подойдет вам, если вы будете готовы использовать коммутатор. – AxelH

+1

Какова ваша настоящая цель? Вы пытаетесь проверить разные комбинации? Может быть, внутренняя петля полезна для вас, если внутри находится элемент if-else. – Braisly

+0

Увы, мне нужно ответить однозначно на каждую конкретную комбинацию учетных кодов. –

ответ

6

Увы, это невозможно в Java. Вы можете включать только интегральные типы, или a java.lang.String из Java версии 7. (Вы не можете использовать эту функциональность в своем собственном типе, переопределяя equals и hashCode от java.lang.Object).

Но , что может вдохновить вас сделать хак:

switch (Integer.toString(account1) + "_" + Integer.toString(account2)){ 
    case "1_1": 
    case "2_1":  
} 

Я считаю, что это удивительно читаемым.

+1

switch String из java 7 Я думаю – AxelH

+0

@AxelH: Да, подтвердилось, вы правы. Спасибо. – Bathsheba

+2

Добро пожаловать. Хороший взломать кстати;) Это все еще много combinaision – AxelH

4

EDIT:

Возможно, это?

public enum Account{ 

    ACC_512_401(512,401), 
    ACC_512_402(512,402); 

    private final int accA; 
    private final int accB; 

    Account(int accA, int accB){ 
     this.accA=accA; 
     this.accB=accB; 
    } 

    private int getAccA(){ 
     return accA; 
    } 
    private int getAccB(){ 
     return accB; 
    } 
    public static Account getEnum(int accA, int accB){ 
     for(Account acc : values()){ 
      if(accA == acc.getAccA() && accB == acc.getAccB()){ 
       return acc; 
      } 
     } 
     return null; 
    } 
} 



public class testswitch { 
    public static void main(String[] args) { 
     test(Account.getEnum(512, 401)); 
    } 

    public static void test(Account acc){ 

     switch (acc){ 
     case ACC_512_401: 
      System.out.println("A"); 
      break; 
     case ACC_512_402: 
      System.out.println("A"); 
      break; 
      default: 
       break; 
     } 
    } 
} 

Вы делаете свой переход по своему перечислению.

EDIT: Я добавил метод getEnum для получения значения для ввода int. Теперь это то, что вы хотите, я думаю.

+0

Упрощенный. Это довольно приятно, поскольку это делает вещи более безопасными по типу, если вы понимаете мой смысл. Хотя, возможно, это не совсем так читаемо в точке «case». – Bathsheba

+0

Почему я забыл «enum's ... приятное решение!». @Bathsheba Если перечисления больше похожи на «A1_1», как ваша идея конкатенации, это все равно будет приемлемым – AxelH

+1

Я предпочитаю этот путь к моему ответу. Я думаю, вы должны изменить его, чтобы включить возможность ярких ярлыков. – Bathsheba

0

Одна из возможных стратегий, как это, небольшое изменение на @ ответ Моргана:

public enum AccountRelationship { 
    BOSS_ACCOUNTS, 
    SECRET_SWISS_TAX_AVOIDING_ACCOUNTS, 
    OTHER; 
} 

public static final Map<AccountPair,AccountRelationship> relationships = new HashMap<>(); 
static { 
    relationships.put(new AccountPair(1,1),AccountRelationship.BOSS_ACCOUNTS); 
    relationships.put(new AccountPair(1,5),AccountRelationship.BOSS_ACCOUNTS); 
    relationships.put(new AccountPair(2,2),AccountRelationship.SECRET_SWISS_TAX_AVOIDING_ACCOUNTS); 
} 

public void doSomething(AccountPair pair) { 
    AccountRelationship rel = relationships.getOrDefault(pair, AccountRelationship.OTHER); 
    switch (rel) { 
    case BOSS_ACCOUNTS: receiveLotsOfBonus(); break; 
    case SECRET_SWISS_TAX_AVOIDING_ACCOUNTS: laughAllTheWayToTheBank(); break; 
    case OTHER: payLotsOfTaxes(); 
    } 
} 

Это отделяет логику определения того, что делать с вызовом действия, что делает вещи намного более читаемым и легче расширить , Не говоря уже о том, что вы можете легко тестировать все отдельно.

Как вы можете видеть, это довольно много.

У этого есть еще одна потенциальная ловушка: карта relationships. Это здорово, если у вас несколько пар пар, для которых требуется одно и то же действие, но когда вы добавляете новое значение в AccountRelationship, легко забыть обновить эту карту.