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

时间:2017-10-14 08:32:52

标签: java java-8 java-stream string-matching

我检查了以下链接 - Link1 Link2 Link3但无法解决&因此张贴。

需要:

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

事务数据表包含需要与Scrip-Info表中的Company名称进行比较的描述。我需要从Scrip-Info Table获取公司代码信息,通过匹配从事务表到Scrip Info Table的多个单词

代码:

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 BANK,因为它在两个表中都是相同的

注意:数据存储在MySQL db&amp;萃取。

脚本信息表

  • [BHARTIARTL,Bharti Airtel Limited]
  • [BHEL,Bharat Heavy Electricals Limited]
  • [CANBK,Canara Bank]
  • [HINDUNILVR,Hindustan Unilever Limited]
  • [MARUTI,Maruti Suzuki India Limited]
  • [TATAPOWER,Tata Power Company Limited]
  • [TATASTEEL,Tata Steel Limited]
  • [TECHM,Tech Mahindra Limited]

交易数据表

  • [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 INDIA LTD。,S,26]
  • [10278,MARUTI SUZUKI INDIA LTD。,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]

1 个答案:

答案 0 :(得分:1)

您可以使用过滤部分。这是一个例子,

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