首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Java8流的部分字符串匹配

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

Stack Overflow用户
提问于 2017-10-14 08:32:52
回答 1查看 842关注 0票数 1

我检查了以下链接-- Link1 Link2 Link3,但无法解决&因此我发布了帖子。

需要:

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

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

代码:

代码语言:javascript
运行
复制
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));
.........

}

尽管我在上面的代码中使用了“Contains”,但只有在数据完全匹配的情况下,它才会得到数据。因此,从下面的示例数据中,我只找到了CANARA银行,因为它在两个表中都是相同的。

注意事项:数据存储在MySQL db中&提取。

Scrip-信息表

  • BHARTIARTL,Bharti Airtel Limited
  • BHEL,Bharat重型电力有限公司
  • Canara银行CANBK
  • HINDUNILVR,Hindustan Unilever Limited
  • MARUTI,Maruti Suzuki India Limited
  • 塔塔电力有限公司
  • 塔塔钢铁有限公司
  • TECHM技术马欣德拉有限公司

事务数据表

  • 10144,卡纳拉银行,B,100
  • 10278,BHARTI AIRTEL有限公司,B,50
  • 10278,BHARTI AIRTEL有限公司,B,20
  • 10278,HIND.UNILEVER有限公司,B,12
  • 10278,HIND.UNILEVER有限公司,B,32
  • 10278,铃木印度有限公司,S,26
  • 10278,铃木印度有限公司,S,26
  • 10278,TECHM FUT 28AUG 14,S,125
  • 10278,TECHM FUT 28AUG 14,B,125
  • 11585,塔塔钢铁有限公司,B,50
  • 11585,塔塔动力公司B,100有限公司

必需的输出:

  • CANBK,B,100
  • B,B,50
  • BHARTIARTL,20
  • B,80
  • HINDUNILVR,B,12
  • HINDUNILVR,B,32
  • HINDUNILVR,B,52
  • 马鲁蒂,S,26
  • MARUTI,B,26岁
  • TECHM,S,125
  • 技术,B,125
  • TATASTEEL,B,50
  • TATAPOWER,B,100

使用当前代码的输出:

  • CANBK,B,100
EN

回答 1

Stack Overflow用户

发布于 2017-10-15 06:21:28

你可以玩过滤部分。以下是一个例子,

代码语言:javascript
运行
复制
    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());

在我的示例中,类ScripInfoTransactionData是简单的POJO,

代码语言:javascript
运行
复制
@Data
@AllArgsConstructor
public class ScripInfo {
    private String symbol;

    private String name;
}

@Data
@AllArgsConstructor
public class TransactionData {
    private String name;

    private String letter;

    private int number;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46742521

复制
相关文章

相似问题

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