我检查了以下链接-Link1 Link2 Link3,但无法解析,因此无法发布。
需要:
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));
.........
}
尽管我在上面的代码中使用了“包含”,但只有在完全匹配时才获取数据。因此,从下面的示例数据中,我发现仅提供CANARA BANK,因为两个表中的数据均相同
注意:数据存储在MySQL数据库中并提取。
证券信息表
[BHARTIARTL,Bharti Airtel Limited]
[BHEL,巴拉特重型电气有限公司]
[加拿大加纳拉银行CANBK]
[HINDUNILVR,印度联合利华有限公司]
[马鲁蒂铃木铃木印度有限公司]
[TATAPOWER,塔塔电力有限公司]
[TATASTEEL,塔塔钢铁有限公司]
[TECHM,Tech Mahindra有限公司]
交易数据表
[10144,CANARA BANK,B,100]
[10278,BHARTI AIRTEL LTD,B,50]
[10278,BHARTI AIRTEL LTD,B,20]
[10278,HIND.UNILEVER LTD。,B,12]
[10278,HIND.UNILEVER LTD。,B,32]
[10278,MARUTI SUZUKI印度有限公司,S,26]
[10278,MARUTI SUZUKI印度有限公司,S,26]
[10278,TECHM FUT 28AUG 14,S,125]
[10278,TECHM FUT 28AUG 14,B,125]
[11585,TATA STEEL LTD。,B,50]
[11585,TATA POWER CO。LTD。,B,100]
要求的输出:
[CANBK,B,100]
[BHARTIARTL,B,50]
[BHARTIARTL,B,20]
[BHARTIARTL,B,80]
[HINDUNILVR,B,12]
[HINDUNILVR,B,32]
[HINDUNILVR,B,52]
[MARUTI,S,26]
[MARUTI,B,26]
[TECHM,S,125]
[TECHM,B,125]
[TATASTEEL,B,50]
[TATAPOWER,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());
在我的示例中,类
ScripInfo
和TransactionData
是简单的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流进行部分字符串匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46742521/