英文:
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");
}
是否有更好的解决方案来实现相同的功能?我怀疑这种方法可能在某些情况下失败。
英文:
Suppose I have a list and then I add names to the list
List<String> listOfName = new ArrayList();
listOfName.add("abc");
listOfName.add("pqr");
listOfName.add("xyz");
And I have a String String names = "abc\r\npqr\r\nxyz";
I want to verify that the string is comprised in the same order as the elements in the list are.
eg: abc should come first then pqr and then xyz
What I am trying to do:
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");
}
Is there any better solution for doing the same as I doubt that it might fail in some scenarios
答案1
得分: 2
你可以使用 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";
// 从列表的项目创建一个以换行符分隔的字符串
String listItems = String.join("\r\n", listOfName);
/*
* 并将其与可能包含这些项目的字符串进行比较
* 以它们在列表中出现的顺序
*/
if (listItems.equals(names)) {
System.out.println(listItems + "\r\n== 相等 ==\r\n"+ names);
} else {
System.err.println(listItems + "\r\n!= 不等于 !=\r\n" + names);
}
}
这将输出:
abc
pqr
xyz
== 相等 ==
abc
pqr
xyz
英文:
You can utilize String.join for this purpose by creating a String from the list of items and put a (Windows-) linebreak (\r\n) as delimiter. Then check if it is equal to the String names, like this:
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);
}
}
This outputs
abc
pqr
xyz
== equals ==
abc
pqr
xyz
答案2
得分: 2
以下是翻译好的代码部分:
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,然后只需在输入的 List 上调用 equals() 来将其与输入的 List 进行比较,因为 List 的 equals() 实现是“如果且仅如果指定的对象也是一个列表,两个列表具有相同的大小,并且两个列表中对应的元素对都相等时返回 true”。
英文:
Well, there is certainly a more "abstract" and semantically pretty way to do this:
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);
}
}
This will print true.
Here you have method checkList() (or whatever name you like) that splits the string using the given delimiter (\r\n in your case), turns the resulting array into a List and just calls equals() on it to compare it with the input List, as the equals() implementation of List (i quote) "Returns true if and only if the specified object is also a list, both lists have the same size, and all corresponding pairs of elements in the two lists are equal.".
答案3
得分: 2
使用Java 8
String names = listOfName.stream().collect(Collectors.joining("\r\n"));
Collectors.joining 的文档 -
返回一个 Collector,它按出现顺序将输入元素连接在一起,以指定的分隔符分隔。
英文:
Using Java 8
String names = listOfName.stream().collect(Collectors.joining("\r\n"));
Documentation of Collectors.joining -
> Returns a Collector that concatenates the input elements, separated by
> the specified delimiter, in encounter order.
答案4
得分: 2
尝试这个。
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
英文:
Try this.
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));
output
true
答案5
得分: 1
你可以将列表转换成数组,然后使用 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
英文:
You can convert the list into an array and then use Arrays.equals to compare it with the array obtained after splitting the string on \r\n.
Demo:
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()));
}
}
Output:
true
答案6
得分: 1
以下是翻译好的代码部分:
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");
}
}
}
英文:
A working example here:
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");
}
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论