首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从许多数组中查找匹配数组的更简单的方法

从许多数组中查找匹配数组的更简单的方法
EN

Code Review用户
提问于 2019-11-27 16:26:40
回答 1查看 49关注 0票数 3

我有以下数组,可以保存许多蓝牙信标的MAC附件及其在建筑物中的位置:

代码语言:javascript
复制
private static final String[][] MAC_ADDRESSES_A_BLUETOOTH = {{"B09122F5D126", "210.105"}, {"B09122F5F26B", "136.121"}, {"B09122F5F619", "181.172"}};
...
private static final String[][] MAC_ADDRESSES_Q_BLUETOOTH = {{"B09122F5D124", "210.105"}, {"B09122F5F26Z", "136.121"}, {"B09122F5F61Q", "181.172"}};

然后,我在寻找基于当前三元组的匹配三元组:

代码语言:javascript
复制
private String[][] compareArrays(String[] beacon) {
        if (Arrays.equals(beacon, getFirstArray(MAC_ADDRESSES_A_BLUETOOTH))) {
            return MAC_ADDRESSES_A_BLUETOOTH;
        } else if (Arrays.equals(beacon, getFirstArray(MAC_ADDRESSES_B_BLUETOOTH))) {
            return MAC_ADDRESSES_B_BLUETOOTH;
        } else if (Arrays.equals(beacon, getFirstArray(MAC_ADDRESSES_C_BLUETOOTH))) {
            return MAC_ADDRESSES_C_BLUETOOTH;
        } else if (Arrays.equals(beacon, getFirstArray(MAC_ADDRESSES_D_BLUETOOTH))) {
            return MAC_ADDRESSES_D_BLUETOOTH;
        } else if (Arrays.equals(beacon, getFirstArray(MAC_ADDRESSES_F_BLUETOOTH))) {
            return MAC_ADDRESSES_F_BLUETOOTH;
        } else if (Arrays.equals(beacon, getFirstArray(MAC_ADDRESSES_G_BLUETOOTH))) {
            return MAC_ADDRESSES_G_BLUETOOTH;
        } else if (Arrays.equals(beacon, getFirstArray(MAC_ADDRESSES_H_BLUETOOTH))) {
            return MAC_ADDRESSES_H_BLUETOOTH;
        } else if (Arrays.equals(beacon, getFirstArray(MAC_ADDRESSES_I_BLUETOOTH))) {
            return MAC_ADDRESSES_I_BLUETOOTH;
        } ...
        } else {
            return null;
        }
}

这段代码看上去糟透了,让我心烦。是否有一种无需编写16条if语句的更简单的方法来做到这一点呢?getFirstArray从一个二维数组返回所有的第一个值。

EN

回答 1

Code Review用户

回答已采纳

发布于 2019-11-27 17:14:29

为提高可读性,请使用对象而不是2d数组。

例如:

代码语言:javascript
复制
public class BluetoothMacAddress {
    private String macAddress;
    private float positionInBuilding;
}

使用java.util.List,您就可以得到一个列表:

代码语言:javascript
复制
private sttaic final List<MacAddress> MAC_ADDRESSES_A_BLUETOOTH = Arrays.asList(
    new BluetoothMacAddress("B09122F5D126", "210.105"),  
    new BluetoothMacAddress("B09122F5F26B", "136.121"), 
    new BluetoothMacAddress("B09122F5F619", "181.172"));

private static final List<List<MAC_ADDRESSES>> MAC_ADDRESSES = Arrays.asList(
    MAC_ADDRESSES_A_BLUETOOTH,
    MAC_ADDRESSES_B_BLUETOOTH 
    ...
);

然后,您的新方法将如下所示:

代码语言:javascript
复制
private MacAddress compareArrays(String[] beacon) {
    for (List<MacAddress> macAddresses : MAC_ADDRESSES ) {
        if (Arrays.equals(beacon, getFirstArray(macAddresses))) {
            return macAddresses;
        }
    }
    // not found
    return null;
}

您必须将beacon参数也更改为MacAddress,或者将MacAddress转换为String[] (或visa-相反)。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/233077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档