从ArrayList中删除字符串

时间:2013-12-06 06:46:37

标签: java arraylist

所以我遇到一个问题,即从用户那里获取人名并将其存储在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>();


}

}

7 个答案:

答案 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);  
   }
}

第二种方法是使用IteratorArrayList)提供的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中删除字符串并将其添加到其他列表