查找 String 中的序列与 List 中的项目相匹配
Find the sequence in the String matches the items in the List
假设我有一个列表,然后我将名字添加到列表中
List<String> listOfName = new ArrayList();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");
我有一个字符串 String names = "abc\r\npqr\r\nxyz";
我想验证字符串的组成顺序是否与列表中元素的顺序相同。
例如:abc 应该先出现,然后是 pqr,然后是 xyz
我想做什么:
int flag = 1;
for(int i=0; i<listOfName.size()-1;i++){
if(names.replace("\r\n","").split(listOfName.get(i))[1].indexOf(listOfName.get(i+1))!=0){
flag = 0;
break;
}
}
if(flag==1){
System.out.println("True");
} else {
System.out.println("False");
}
是否有更好的解决方案来做同样的事情,因为我怀疑它在某些情况下可能会失败
您可以利用 String.join
从项目列表中创建一个 String
并将 (Windows-) 换行符 (\r\n
) 作为分隔符.然后检查它是否等于String names
,像这样:
public static void main(String[] args) {
List<String> listOfName = new ArrayList<>();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");
String names = "abc\r\npqr\r\nxyz";
// create a linebreak-separated String from the items of the list
String listItems = String.join("\r\n", listOfName);
/*
* and compare it to the String that might contain those items
* in the order they appear in the list
*/
if (listItems.equals(names)) {
System.out.println(listItems + "\r\n== equals ==\r\n"+ names);
} else {
System.err.println(listItems + "\r\n!= is not equal to !=\r\n" + names);
}
}
这输出
abc
pqr
xyz
== equals ==
abc
pqr
xyz
可以将列表转成数组,然后用Arrays.equals
与\r\n
上拆分字符串得到的数组进行比较。
演示:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> listOfName = new ArrayList<>();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");
String names = "abc\r\npqr\r\nxyz";
String[] namesArr = names.split("\r\n");
System.out.println(Arrays.equals(namesArr, listOfName.toArray()));
}
}
输出:
true
这里有一个工作示例:
import java.util.List;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
List<String> listOfName = new ArrayList();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");
String names = "abc\r\npqr\r\nxyz";
String[] splitted_names = names.split("\r\n");
boolean noNameFound = true;
for (String name : splitted_names) {
if (listOfName.contains(name)) {
System.out.println("Found name " + name + " in listOfName! ");
noNameFound = false;
}
}
if (noNameFound) {
System.out.println("No name found that matched");
}
}
}
嗯,肯定有更“抽象”和语义上更漂亮的方法来做到这一点:
public class CompareList {
public static void main(String[] args) {
List<String> listOfNames = new ArrayList<String>();
listOfNames.add("abc");
listOfNames.add("pqr");
listOfNames.add("xyz");
String names = "abc\r\npqr\r\nxyz"; // define string
boolean match = checkList(listOfNames, names, "\r\n"); //check match
System.out.println(match); //print match
}
private static boolean checkList(
List<String> list,
String content,
String delimiter) {
return Arrays.asList(
content.split(Pattern.quote(delimiter))).equals(list);
}
}
这将打印 true
。
在这里你有方法checkList()
(或你喜欢的任何名称)使用给定的分隔符(在你的例子中是\r\n
)分割字符串,将结果数组变成List
并调用 equals()
将其与输入 List
进行比较,作为 List
的 equals()
实现(我引用)"Returns 当且仅当指定对象也是一个列表时为真,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等。".
使用 Java 8
String names = listOfName.stream().collect(Collectors.joining("\r\n"));
Collectors.joining
的文档 -
Returns a Collector that concatenates the input elements, separated by
the specified delimiter, in encounter order.
试试这个。
List<String> listOfName = new ArrayList<>();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");
String names = "abc\r\npqr\r\nxyz";
System.out.println(String.join("\r\n", listOfName).equals(names));
输出
true
假设我有一个列表,然后我将名字添加到列表中
List<String> listOfName = new ArrayList();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");
我有一个字符串 String names = "abc\r\npqr\r\nxyz";
我想验证字符串的组成顺序是否与列表中元素的顺序相同。
例如:abc 应该先出现,然后是 pqr,然后是 xyz
我想做什么:
int flag = 1;
for(int i=0; i<listOfName.size()-1;i++){
if(names.replace("\r\n","").split(listOfName.get(i))[1].indexOf(listOfName.get(i+1))!=0){
flag = 0;
break;
}
}
if(flag==1){
System.out.println("True");
} else {
System.out.println("False");
}
是否有更好的解决方案来做同样的事情,因为我怀疑它在某些情况下可能会失败
您可以利用 String.join
从项目列表中创建一个 String
并将 (Windows-) 换行符 (\r\n
) 作为分隔符.然后检查它是否等于String names
,像这样:
public static void main(String[] args) {
List<String> listOfName = new ArrayList<>();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");
String names = "abc\r\npqr\r\nxyz";
// create a linebreak-separated String from the items of the list
String listItems = String.join("\r\n", listOfName);
/*
* and compare it to the String that might contain those items
* in the order they appear in the list
*/
if (listItems.equals(names)) {
System.out.println(listItems + "\r\n== equals ==\r\n"+ names);
} else {
System.err.println(listItems + "\r\n!= is not equal to !=\r\n" + names);
}
}
这输出
abc
pqr
xyz
== equals ==
abc
pqr
xyz
可以将列表转成数组,然后用Arrays.equals
与\r\n
上拆分字符串得到的数组进行比较。
演示:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> listOfName = new ArrayList<>();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");
String names = "abc\r\npqr\r\nxyz";
String[] namesArr = names.split("\r\n");
System.out.println(Arrays.equals(namesArr, listOfName.toArray()));
}
}
输出:
true
这里有一个工作示例:
import java.util.List;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
List<String> listOfName = new ArrayList();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");
String names = "abc\r\npqr\r\nxyz";
String[] splitted_names = names.split("\r\n");
boolean noNameFound = true;
for (String name : splitted_names) {
if (listOfName.contains(name)) {
System.out.println("Found name " + name + " in listOfName! ");
noNameFound = false;
}
}
if (noNameFound) {
System.out.println("No name found that matched");
}
}
}
嗯,肯定有更“抽象”和语义上更漂亮的方法来做到这一点:
public class CompareList {
public static void main(String[] args) {
List<String> listOfNames = new ArrayList<String>();
listOfNames.add("abc");
listOfNames.add("pqr");
listOfNames.add("xyz");
String names = "abc\r\npqr\r\nxyz"; // define string
boolean match = checkList(listOfNames, names, "\r\n"); //check match
System.out.println(match); //print match
}
private static boolean checkList(
List<String> list,
String content,
String delimiter) {
return Arrays.asList(
content.split(Pattern.quote(delimiter))).equals(list);
}
}
这将打印 true
。
在这里你有方法checkList()
(或你喜欢的任何名称)使用给定的分隔符(在你的例子中是\r\n
)分割字符串,将结果数组变成List
并调用 equals()
将其与输入 List
进行比较,作为 List
的 equals()
实现(我引用)"Returns 当且仅当指定对象也是一个列表时为真,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等。".
使用 Java 8
String names = listOfName.stream().collect(Collectors.joining("\r\n"));
Collectors.joining
的文档 -
Returns a Collector that concatenates the input elements, separated by the specified delimiter, in encounter order.
试试这个。
List<String> listOfName = new ArrayList<>();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");
String names = "abc\r\npqr\r\nxyz";
System.out.println(String.join("\r\n", listOfName).equals(names));
输出
true