打开一对`int`s

问题描述 投票:3回答:4

一些背景:我正在解析一个会计分类账,其中account1account2int类型。每个都是[0,99999]范围内的数字。我有很多组合需要考虑。

理想情况下,我想使用类似的东西

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

java switch-statement
4个回答
8
投票

唉,这在Java中是不可能的。您只能在Java版本7中打开整数类型或java.lang.String。(您无法通过覆盖equals中的hashCodejava.lang.Object将此功能构建到您自己的类型中)。

但这可能会激励你做一个黑客:

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

我发现这是令人惊讶的可读性。


4
投票

编辑:

也许这个?

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;
        }
    }
}

你切换你的枚举。

编辑:我添加了getEnum方法来获取int输入的值。现在这就是你想要的。


0
投票

一个可能的策略就是这样,@ Morgan的回答略有不同:

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添加新值时,很容易忘记更新此地图。


0
投票

只是为了使用素数的乐趣:(它在上述范围内是安全的,但在高整数时它肯定会失败)

案例计算将在编译时完成。

public class Switch {

    public static void main(String[] args) {
        int i = 1;
        int j = 2;
        switch (i * 2 + j * 3) {
        case 1 * 2 + 2 * 3:
            System.out.println("match");
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.