在這里給定一個帶有重復模式的字串:
String s = NameJJ,ABC/firstname,120, NameBB,ABC/secondname,100,NameCC,ABC/thirdname,150,NameJJ,ABC/firstname,200,NameBB,ABC/secondname,300,NameCC,ABC/thirdname,500
本質上,我想要一種方式,當 NameJJ 和名字彼此并排時,就像在頂部一樣,它在它們旁邊存盤值,即 arraylist1 = [120,200]。
本質上,我希望所有具有 NameBB 和 secondname 的欄位都在彼此旁邊以存盤它們旁邊的值,即 arraylist2 = [100,300]。
本質上,我希望所有具有 NameJJ 和 thirdname 的欄位都在彼此旁邊以存盤它們旁邊的值,即 arraylist3 = [150,500]。
我試圖這樣做是為了說如果字串包含 NameJJ 并且包含 firstname 應該過濾掉它旁邊的值,但我對如何做到這一點感到困惑,這是代碼:
if (s.contains(NameJJ) && s.contains(firstname))
Pattern reg = Pattern.compile(",");
ArrayList<String> SANR = reg.splitAsStream(s)
.filter(role -> role.contains(""))
.map(String::trim)
.collect(Collectors.toCollection(ArrayList::new));
uj5u.com熱心網友回復:
您String s擁有完整的資料,因此if (s.contains(NameJJ) && s.contains(firstname))將始終如此true。您必須先拆分塊,然后查看值。
您的資料塊每個包含 3 個資料,因此這是您必須在回圈條件中除以并在陣列訪問中乘以的數字
String s = "NameJJ,ABC/firstname,120, NameBB,ABC/secondname,100,NameCC,ABC/thirdname,150,NameJJ,ABC/firstname,200,NameBB,ABC/secondname,300,NameCC,ABC/thirdname,500";
String[] split = s.split(",");
List<Integer> first = new ArrayList<>();
List<Integer> second = new ArrayList<>();
List<Integer> third = new ArrayList<>();
for (int i = 0; i < split.length / 3; i ) {
// first data block is Name..
// second block is firstname/secondname/thirdname
// third block hold the number you want
if (split[3 * i].trim().equals("NameJJ") && split[3 * i 1].trim().equals("ABC/firstname")) {
first.add(Integer.parseInt(split[3 * i 2].trim()));
} else if (split[3 * i].trim().equals("NameBB") && split[3 * i 1].trim().equals("ABC/secondname")) {
second.add(Integer.parseInt(split[3 * i 2].trim()));
} else if (split[3 * i].trim().equals("NameCC") && split[3 * i 1].trim().equals("ABC/thirdname")) {
third.add(Integer.parseInt(split[3 * i 2].trim()));
}
}
System.out.println(first);
System.out.println(second);
System.out.println(third);
輸出是
[120, 200]
[100, 300]
[150, 500]
uj5u.com熱心網友回復:
正如我在您的上一個問題中回答的那樣,每當您有某種重復的模式時,您應該使用正則運算式來提取模式的子位。
流并非旨在跟蹤“第一個”或“最后一個”元素。它們主要是無狀態操作,除了distinct,sorted和類似的一些例外。無狀態操作甚至在前一個操作完成計算之前就開始執行。這就是為什么他們不記得第一個或最后一個結果,也是為什么我們不能將它們用于此類任務的原因。
您可以做的是使用 3 個正則運算式來匹配您的 nameJJ、nameBB 和 nameCC 模式,并使用捕獲組來識別和提取每個所需的子位。
以下 3 個正則運算式可用于匹配您的模式:
(\w )JJ,(\w )\/(\w ),(\d )
(\w )BB,(\w )\/(\w ),(\d )
(\w )CC,(\w )\/(\w ),(\d )
這是代碼實作的片段:
public class Main {
public static void main(String[] args) {
String s = "NameJJ,ABC/firstname,120, NameBB,ABC/secondname,100,NameCC,ABC/thirdname,150,NameJJ,ABC/firstname,200,NameBB,ABC/secondname,300,NameCC,ABC/thirdname,500";
List<Integer> listNameJJ = getList("(\\w )JJ,(\\w )\\/(\\w ),(\\d )", s);
List<Integer> listNameBB = getList("(\\w )BB,(\\w )\\/(\\w ),(\\d )", s);
List<Integer> listNameCC = getList("(\\w )CC,(\\w )\\/(\\w ),(\\d )", s);
System.out.println(listNameJJ);
System.out.println(listNameBB);
System.out.println(listNameCC);
}
public static List<Integer> getList(String regex, String str) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
List<Integer> list = new ArrayList<>();
while (matcher.find()) {
list.add(Integer.valueOf(matcher.group(4)));
}
return list;
}
}
這里還有一個測驗上面代碼的鏈接:
https://ideone.com/TES5UY
uj5u.com熱心網友回復:
這是另一個例子,
public class Application {
public static void main(String[] args) {
String yourString = "NameJJ,ABC/firstname,120, NameBB,ABC/secondname,100,NameCC,ABC/thirdname,150,NameJJ,ABC/firstname,200,NameBB,ABC/secondname,300,NameCC,ABC/thirdname,500";
String myString = "NameKK,ZXY/kname,510, NameQQ,HLM/kname,210, NameKK,ZXY/kname,210,";
// Test 1
System.out.println(getValues("NameJJ", "firstname", yourString));
// Test 2
System.out.println(getValues("NameKK", "kname", myString));
}
private static List<Integer> getValues(String str1, String str2, String inputString) {
// Note* List is an ordered sequence of elements.
List<Integer> value = new ArrayList<Integer>();
// Extract Values
Matcher m = Pattern.compile("-?\\d (,\\d )*?\\.?\\d ?")
.matcher(inputString);
while (m.find()) {
value.add(Integer.parseInt(m.group().trim()));
}
// Extract Keys
List<String> key = List.of(inputString.split("\\d "));
List<Integer> result = new ArrayList<Integer>();
// Filtering
for (int i = 0; i < value.size(); i ) {
if (key.get(i).trim().contains(str1)
&& key.get(i).trim().contains(str2)) {
result.add(value.get(i));
}
}
return result;
}
}
控制臺 O/P:
[120, 200]
[510, 210]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/478934.html
