所以我遇到一个问题,即从用户那里获取人名并将其存储在ArrayList(personalNames)中。之后,我需要获取该列表并删除除了字母a-z(带有数字或符号的任何内容)之外的任何名称,并将它们放入一个保存错误的单独ArrayList(errorProneNames)中。有人可以帮我删除部分吗?
public class NameList {
public static void main(String[] args) {
ArrayList<String> personalNames = new ArrayList<String>();
Scanner input = new Scanner(System.in);
String answer;
do{
System.out.println("Enter the personal Names: ");
String names = input.next();
personalNames.add(names);
System.out.println("would you like to enter another name (yes/no)?");
answer = input.next();
} while (answer.equalsIgnoreCase("yes"));
ArrayList<String> errorProneNames = new ArrayList<String>();
}
}
答案 0 :(得分:2)
如果是“如何从ArrayList<>
”部分删除导致问题的元素,并且您想要检查所有值,则可能需要使用Iterator
并调用{ {1}}:
remove
请注意,当您使用迭代器在增强型for循环()中迭代时,不得从集合中删除元素。所以这是错误的:
for (Iterator<String> iterator = personalNames.iterator(); iterator.hasNext(); ) {
String name = iterator.next();
if (isErrorProne(name)) {
iterator.remove();
}
}
这将抛出// BAD CODE: DO NOT USE
for (String name : personalNames) {
if (isErrorProne(name)) {
personalNames.remove(name);
}
}
。
另一种选择是创建好的名称的新列表:
ConcurrentModificationException
现在,如果您真正的问题是您不知道如何编写List<String> goodNames = new ArrayList<>();
for (String name : personalNames) {
if (!isErrorProne(name)) {
goodNames.add(name);
}
}
方法,那就是另一回事了。我怀疑你想使用正则表达式检查名称只包含字母,空格,连字符和撇号 - 但你应该仔细考虑完全你想要的东西。所以可能想要:
isErrorProne
请注意,例如,这不会处理重音字符。也许这对你的情况没问题 - 也许不是。您需要准确考虑要允许的内容,并相应地调整正则表达式。
你可能还想考虑用某个好的名称来表达它,而不是它是否是坏名称 - 特别是如果你使用的最后一种方法建立一个新的好名单。
答案 1 :(得分:1)
您可以使用ArrayList的remove()方法
personalNames.remove("stringToBeRemoved");
有很多重载方法可供使用。您可以使用索引,对象(字符串本身)等删除。您可以查看Javadocs以获取更多信息。
同样要删除除a-z字母以外的所有字符串,您可以使用正则表达式。逻辑如下
String regex = "[a-zA-Z]*";
String testString = "abc1";
if(!testString.matches(regex)){
System.out.println("Remove this");
}
正如Jon在迭代List时指出的那样,不要使用Lists的remove()方法,而是使用迭代器remove()方法。
答案 2 :(得分:1)
以下是您的解决方案:
String regex = "[a-zA-Z]*";
for (String temp : personalNames ) {
if (!temp.matches(regex)){
errorProneNames.add(temp);
personalNames.remove(temp);
}
}
答案 3 :(得分:0)
使用正则表达式[a-zA-Z ]+
与String.matches
一起测试容易出错的名称,并Iterator
进行删除。
Iterator<String> it=personalNames.iterator();
while(it.hasNext()){
String name=it.next();
if(name.matches("[a-zA-Z ]+")){
it.remove();
}
}
答案 4 :(得分:0)
有两种方法可以做到这一点:
第一种是向后遍历列表,删除它们,然后将它们添加到第二个列表中。我说要倒退,因为它会改变索引。
for (int i = personalNames.size()-1; i >=0; i++) {
if (isBadName(personalNames.get(i)]){
errorProneNames.add(personalNames.get(i));
personalNames.remove(i);
}
}
第二种方法是使用Iterator
(ArrayList
)提供的personalNames.iterator()
。这将允许你继续前进。
答案 5 :(得分:0)
我可能会这样做
// Check that the string contains only letters.
private static boolean onlyLetters(String in) {
if (in == null) {
return false;
}
for (char c : in.toCharArray()) {
if (!Character.isLetter(c)) {
return false;
}
}
return true;
}
public static void main(String[] args) {
ArrayList<String> personalNames = new ArrayList<String>();
ArrayList<String> errorProneNames = new ArrayList<String>(); // keep this list here.
Scanner input = new Scanner(System.in);
String answer;
do {
System.out.println("Enter the personal Names: ");
String names = input.next();
if (onlyLetters(names)) { // test on input.
personalNames.add(names); // good.
} else {
errorProneNames.add(names); // bad.
}
System.out
.println("would you like to enter another name (yes/no)?");
answer = input.next();
} while (answer.equalsIgnoreCase("yes"));
}
答案 6 :(得分:0)
从列表中获取一个迭代器,而itr有下一个元素将它赋给一个方法,例如isNotProneName,它接受一个String并返回true或false,如果给定的String不匹配你的需要。 if false返回从itr中删除字符串并将其添加到其他列表