gpt4 book ai didi

java - 使用 Java8 Streams 进行部分字符串匹配

转载 作者:行者123 更新时间:2023-11-30 06:27:54 24 4
gpt4 key购买 nike

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

需要:

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

交易数据表包含需要与 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));
.........

}

虽然我在上面的代码中使用了“包含”,但只有在完全匹配时才会获取数据。因此,从下面我提供的示例数据中,仅找到 CANARA BANK,因为它在两个表中都是相同的

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

票据信息表

  • [BHARTIARTL、Bharti Airtel 有限公司]
  • [BHEL,巴拉特重型电气有限公司]
  • [CANBK、卡纳拉银行]
  • [HINDUNILVR,印度斯坦联合利华有限公司]
  • [MARUTI,马鲁蒂铃木印度有限公司]
  • [TATAPOWER,塔塔电力有限公司]
  • [TATASTEEL,塔塔钢铁有限公司]
  • [TECHM,马恒达科技有限公司]

交易数据表

  • [10144,CANARA 银行,B,100]
  • [10278,BHARTI AIRTEL LTD,B,50]
  • [10278,BHARTI AIRTEL LTD,B,20]
  • [10278,HIND.UNILEVER 有限公司,B,12]
  • [10278,HIND.UNILEVER 有限公司,B,32]
  • [10278,马鲁蒂铃木印度有限公司,S,26]
  • [10278,马鲁蒂铃木印度有限公司,S,26]
  • [10278,TECHM FUT,2014 年 8 月 28 日,S,125]
  • [10278,TECHM FUT,2014 年 8 月 28 日,B,125]
  • [11585,塔塔钢铁有限公司,B,50]
  • [11585,塔塔电力有限公司,B,100]

所需输出:

  • [CANBK,B,100]
  • [BHARTIARTL,B,50]
  • [BHARTIARTL,B,20]
  • [BHARTIARTL,B,80]
  • [HINDUNILVR,B,12]
  • [HINDUNILVR,B,32]
  • [HINDUNILVR,B,52]
  • [马鲁蒂,S,26]
  • [马鲁蒂,B,26]
  • [TECHM,S,125]
  • [技术,B,125]
  • [塔塔钢铁,B,50]
  • [塔塔电力,B,100]

使用当前代码输出:

  • [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());

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

@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;
}

关于java - 使用 Java8 Streams 进行部分字符串匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46742521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com