Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java8流的部分字符串匹配_Java_Java 8_Java Stream_String Matching - Fatal编程技术网

使用Java8流的部分字符串匹配

使用Java8流的部分字符串匹配,java,java-8,java-stream,string-matching,Java,Java 8,Java Stream,String Matching,我检查了以下链接-但无法解决&因此发布 需要: 2个字符串字段的字符串部分匹配(不可能在所有情况下完全匹配)&从匹配行获取信息。数据存储在MySQL数据库中 交易数据表包含需要与Scrip Info表中的公司名称进行比较的说明。我需要从Scrip info表中获取公司代码信息,方法是将交易表中的尽可能多的单词匹配到Scrip info表中 代码: for (List<String> listData : transactionData) { List<List&l

我检查了以下链接-但无法解决&因此发布

需要:

2个字符串字段的字符串部分匹配(不可能在所有情况下完全匹配)&从匹配行获取信息。数据存储在MySQL数据库中

交易数据表包含需要与Scrip Info表中的公司名称进行比较的说明。我需要从Scrip info表中获取公司代码信息,方法是将交易表中的尽可能多的单词匹配到Scrip info表中

代码:

for (List<String> listData : transactionData) {
       List<List<String>> code = scripInfo.stream()
                .filter(p -> p.get(1).toUpperCase().contains(listData.get(1).toUpperCase()))
                .collect(Collectors.toList());
// Output to console to check if its working
code.forEach(p -> System.out.println(p.get(0)));
//Prepare Output List
List<Object> rowData = new ArrayList<>();
rowData.add(code.get(0));
rowData.add(listData.get(2));
rowData.add(listData.get(3));
.........

}
for(列表数据:transactionData){
列表代码=scripInfo.stream()
.filter(p->p.get(1.toUpperCase().contains)(listData.get(1.toUpperCase()))
.collect(Collectors.toList());
//输出到控制台以检查其是否工作
code.forEach(p->System.out.println(p.get(0));
//准备输出列表
List rowData=new ArrayList();
rowData.add(code.get(0));
添加(listData.get(2));
添加(listData.get(3));
.........
}
尽管我在上面的代码中使用了“Contains”,但只有当数据完全匹配时,它才能获取数据。因此,从下面我提供的示例数据中,只能找到卡纳拉银行,因为它在两个表中是相同的

注意:数据存储在MySQL数据库中并提取

票据信息表

  • [BHARTIARTL,BhartiAirtel有限公司]
  • [BHEL,巴拉特重型电气有限公司]
  • [加拿大银行,卡纳拉银行]
  • [印度联合利华,印度斯坦联合利华有限公司]
  • [马鲁蒂,马鲁蒂铃木印度有限公司]
  • [塔塔电力,塔塔电力有限公司]
  • [塔塔斯泰尔,塔塔钢铁有限公司]
  • [TECHM,TechMahindra有限公司]
交易数据表

  • [10144,卡纳拉银行,B,100]
  • [10278,BHARTI AIRTEL有限公司,B,50]
  • [10278,BHARTI AIRTEL有限公司,B,20]
  • [10278,兴德联合利华有限公司,B,12]
  • [10278,兴德联合利华有限公司,B,32]
  • [10278,马鲁蒂铃木印度有限公司,S,26]
  • [10278,马鲁蒂铃木印度有限公司,S,26]
  • [10278,TECHM FUT 288年8月14日,南,125]
  • [10278,TECHM FUT 288年8月14日,B,125]
  • [11585,塔塔钢铁有限公司,B,50]
  • [11585,塔塔电力有限公司,B,100]
所需输出:

for (List<String> listData : transactionData) {
       List<List<String>> code = scripInfo.stream()
                .filter(p -> p.get(1).toUpperCase().contains(listData.get(1).toUpperCase()))
                .collect(Collectors.toList());
// Output to console to check if its working
code.forEach(p -> System.out.println(p.get(0)));
//Prepare Output List
List<Object> rowData = new ArrayList<>();
rowData.add(code.get(0));
rowData.add(listData.get(2));
rowData.add(listData.get(3));
.........

}
  • [CANBK,B,100]
  • [BHARTIARTL,B,50]
  • [巴蒂亚尔,B,20]
  • [BHARTIARTL,B,80]
  • [印度教,B,12]
  • [印度教,B,32]
  • [印度教,B,52]
  • [马鲁蒂,S,26]
  • [马鲁蒂,B,26]
  • [TECHM,S,125]
  • [TECHM,B,125]
  • [塔塔斯泰尔,B,50]
  • [塔塔动力,B,100]
当前代码的输出:

for (List<String> listData : transactionData) {
       List<List<String>> code = scripInfo.stream()
                .filter(p -> p.get(1).toUpperCase().contains(listData.get(1).toUpperCase()))
                .collect(Collectors.toList());
// Output to console to check if its working
code.forEach(p -> System.out.println(p.get(0)));
//Prepare Output List
List<Object> rowData = new ArrayList<>();
rowData.add(code.get(0));
rowData.add(listData.get(2));
rowData.add(listData.get(3));
.........

}
  • [CANBK,B,100]

您可以使用过滤部分。举个例子,

    List<TransactionData> filteredData =
            transactionData.stream().filter(t ->
            {
                List<ScripInfo> filteredScrip =
                        scripInfo.stream().filter(s -> {
                            String[] tranTokens =
                                    t.getName().toUpperCase().split(
                                            " |\\.");
                            String[] scripTokens =
                                    s.getName().toUpperCase().split(" ");
                            String scripSysmbol =
                                    s.getSymbol().toUpperCase();
                            if (tranTokens[0].contains(scripTokens[0])) {
                                return true;
                            } else if (scripSysmbol.contains(
                                    tranTokens[0])) {
                                return true;
                            }
                            return false;
                        }).collect(Collectors.toList());

                return filteredScrip.size() > 0 ? true : false;

            }).collect(Collectors.toList());
p.get(1)在做什么?为什么您认为
contains
作为输出应该做您希望做的事情?p.get(1)从Scrip Info表中获取公司名称信息,转换为大写并进行比较。我对contains的理解是,它将尝试匹配来自LtoR的尽可能多的单词,我想我的理解偏离了目标。您可能希望为您的用例实现一个匹配算法,将速记名称绑定到全名中,或者在另一个数据结构中保留此类名称的映射,该数据结构可以在当前循环中查找。