如果后者是Map中的Key?</string>,如何从ArrayList <string>中检索值

时间:2014-07-24 13:15:20

标签: java arraylist map

我是Java新手。现在我正在尝试使用像

这样的结构
 Map<List<String>,String>    

..从列表中检索字符串有困难。

详细说明: 我正在制作一个简单的程序,它接收电话号码并检查国家特定号码所属的号码。它通过匹配正则表达式来检查它们(基础数字量和国际前缀:因为前缀(因此 - 正则表达式)可能多于一个 - 选择列表)。

因此,正则表达式的结构是:

"^(%s)\\d{%d}", prefix, digitAmount    

某些数字(芬兰语,英语)有一些基本数据,但用户也可以添加新数据(例如:Gonduras - 前缀:849,位数:8,Gonduras(相同) - 前缀49,位数:7等) 所以当你输入一个像893143045839这样的数字时 - 它应该找到它是否与正则表达式匹配。如果是,返回国家(一个值)。这就是选择地图的原因。

这里的代码是:

static Map <List<String>, String> data = new HashMap<List<String>, String>();
static List<String> newdata = new ArrayList<String>();

void addBasicData ()  // here I add some predefined parameters
{
List<String> finnNumbers = new ArrayList<String>();
finnNumbers.add("^(3589)\\d{6}");
finnNumbers.add("^(003589)\\d{6}");
finnNumbers.add("^(09)\\d{6}");
data.put(finnNumbers, "Finland");
}


void addNewData (String pattern, List<String> newdata)   //here I add new data from user
{
pattern();
data.put(newdata, pattern);
}    

问题进一步发生。当我想检查一些数字时,我必须制作一个模式 - 应该从数据中获取正则表达式。好吧,似乎我做不到。 这是方法..

void numberCheck (String inputNumber)
{

// maybe I'll use Set values = data.keySet(); ? ...nah, doesn't work either :(


for (int i = 0; i<= data.size(); i++)
{
    Object c = data.get(i);
    List<String> check = (List<String>)c;
    for (int j = 0; j <check.size(); j++)   
    {

        Pattern pat = Pattern.compile(check.get(j));
        Matcher matcher = pat.matcher(inputNumber);
        if (matcher.find())
        {
            // some useful code
        }

    }


}

..,它不起作用并给出NullPointerException。当我想要一个键然后尝试每个正则表达式作为模式时,它反而给了我一个Object,而不是一个ArrayList。这就是我要问的原因。 我尝试使用反向(Map&gt;),但后来我需要迭代值,并且存在同样的问题。

这是重点

    Object c = data.get(i);
    List<String> check = (List<String>)c;

,一切都崩溃了。 也许,我这样做完全错了,应该在我的案例中使用另一个类。

如果有人可以提出建议,我会很高兴的。谢谢!

2 个答案:

答案 0 :(得分:2)

我想这就是你想做的事情

Map<String, List<String>> map = new HashMap<String, List<String>>();
// ...some more code...
for (List<String> regexNumbers : map.values()) {
    // regexNumbers is the value
}

由于您不使用方法中的密钥。

但是如果你创建一个类,那么你的代码可以更具可读性 - 这就是你的结构,这就是你想要的,你知道(!)它是什么(即使在几年内):

class CountryNumbers {
    String country;
    List<String> numbers;
}

将每个号码打印到国家/地区的示例代码:

List<CountryNumbers> list = fillListSomehow();
for (CountryNumbers countryNumbers : list) {
    String country = countryNumbers.country;
    System.out.println("The regexes for country " + country + " are: ");
    for (String regexNumber : countryNumbers.numbers) {
        System.out.println("  " + regexNumber);
    }
}

答案 1 :(得分:-1)

而不是

static Map <List<String>, String> data = new HashMap<List<String>, String>();

你应该做

static Map <String, List<String>> data = new HashMap<String, List<String>>();

然后,当您尝试浏览值

void numberCheck (String inputNumber)
{


    String[] keys = (String[]) data.keySet().toArray();
for (int i = 0; i<= keys.length; i++)
{
    List<String> check = (List<String>)data.get(keys[i]);
    for (int j = 0; j <check.size(); j++)   
    {

        Pattern pat = Pattern.compile(check.get(j));
        Matcher matcher = pat.matcher(inputNumber);
        if (matcher.find())
        {
            // some useful code
        }

    }


}
}

它实际上会返回一个List。通过调用data.get(i),您要求地图中索引为i的数据集的值为。