英文:
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");
}
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论