Java 如何从ArrayList中检索值<;字符串>;如果后者是地图中的一个键?

Java 如何从ArrayList中检索值<;字符串>;如果后者是地图中的一个键?,java,arraylist,map,Java,Arraylist,Map,我是Java新手。现在我正试图用一种类似 Map<List<String>,String> 有些数字有一些基本数据(芬兰语、英语),但用户也可以添加新数据(例如:Gonduras-前缀:849,位数:8,Gonduras(相同)-前缀49,位数:7等) 所以,当您输入一个像893143045839这样的数字时,应该会发现它是否匹配正则表达式。如果是,则返回国家(一个值)。这就是为什么选择了地图 这里的代码是: static Map <List<St

我是Java新手。现在我正试图用一种类似

 Map<List<String>,String>    
有些数字有一些基本数据(芬兰语、英语),但用户也可以添加新数据(例如: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);
}    
staticmap data=newhashmap();
静态列表newdata=newarraylist();
void addBasicData()//这里我添加了一些预定义的参数
{
列表编号=新的ArrayList();
加上(“^(3589)\\d{6}”);
加上(“^(003589)\\d{6}”);
加上(“^(09)\\d{6}”);
数据。put(芬兰数字,“芬兰”);
}
void addNewData(字符串模式,List newdata)//在这里我添加了来自用户的新数据
{
模式();
data.put(新数据、模式);
}    
问题进一步出现。当我想检查一些数字时,我必须制作一个模式——它应该从数据中提取正则表达式。看来我不能。 这是方法

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
        }

    }


}
void numberCheck(字符串输入编号)
{
//也许我会使用Set values=data.keySet();?…不,也不起作用:(
对于(int i=0;i而不是

staticmap data=newhashmap();

你应该这样做

staticmap data=newhashmap();

然后,当您尝试遍历这些值时

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
        }

    }


}
}
void numberCheck(字符串输入编号)
{
String[]keys=(String[])data.keySet().toArray();

对于(inti=0;i我想这就是你想要做的

Map<String, List<String>> map = new HashMap<String, List<String>>();
// ...some more code...
for (List<String> regexNumbers : map.values()) {
    // regexNumbers is the value
}
Map Map=newhashmap();
//…更多的代码。。。
对于(列表regexNumbers:map.values()){
//regexNumbers是值
}
因为您在方法中不使用密钥

但是,如果您创建一个类,您的代码将更具可读性-这是您的结构,这是您想要的,并且您知道(!)其中包含什么(即使在几年内):

类别国家编号{
弦国;
清单编号;
}
示例将每个数字打印到某个国家/地区的代码:

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);
    }
}
List-List=FillListList();
用于(CountryNumber CountryNumber:列表){
字符串country=countrynumber.country;
System.out.println(“country”+country+的正则表达式为:”;
for(字符串regexNumber:countryNumbers.numbers){
System.out.println(“+regexNumber”);
}
}

您有一个
映射
。映射的键因此是
列表
实例。
整数
不是
列表
。因此调用
数据。get(i)
如果我是一个整数,你将一无所获。我不确定我是否理解你的意图。这里的映射似乎不是合适的数据结构。我正在尝试迭代映射。先获取(i=1)ArrayList(键)并检查它是否匹配,然后获取第二个(i=2)等等。比如数组。我现在将更精确地了解如何正确迭代集合。关于数据结构:可能不是。我还没有弄清楚应该使用什么结构。逻辑很简单:1.用户键入一个数字:7941949394 2。这个数字作为方法的输入,该方法检查它是否与某些正则表达式匹配(这是一个值的键之一)3.如果匹配(例如“^(79)\\d{8}”)-那么它应该返回一个国家为什么不像地图一样返回一个国家,其中键是国家,值是电话号码列表我试图将其反转,但我如何在没有键的情况下检索值(没有关于国家的信息,只有输入的数字).我的意思是,最终还是一样的:我应该检索所有值(在本例中)并匹配它不是我(我甚至没有投票权:)谢谢!如果您仍然使用
整数
查找所有键都是
字符串
的值,我将尝试这样做。这意味着您永远不会得到值。遗憾的是,映射接口定义了
get()
作为一个
对象
而不是键类型的实例。-1请参阅unholy的评论。
映射
不是一个列表。您不会通过传递索引来迭代它。而是使用
入口集
。应该迭代
条目
,以便在找到匹配项时他拥有键/国家。同意sug对于
CountryNumbers
。建议在
CountryNumbers
中添加方法
numberMatches
。仅供参考,使用Multimap而不是Map:谢谢,伙计们!对Sneaker182:听起来是个好主意。这个程序非常小,但仅适用于OOP标准。到目前为止,我已经创建了两个类:NumCheck和Main(主要用于GUI和运行)。在checking one中-用于检查数字和事件侦听器的方法。我还考虑如何将新数据保存到某个文件中(我应该选择什么文件格式保存集合(或对象),以便在下一次启动程序后检索它)我从未与其他图书馆合作过,比如guava(对它们知之甚少),但我会去看看
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);
    }
}