2013-12-06 3 views
0

Так что у меня есть проблема, которая принимает имена людей от пользователя и сохраняет их в ArrayList (персональные имена). После этого мне нужно взять этот список и удалить любое имя, в котором есть что-либо помимо букв a-z (что-нибудь с цифрами или символами) и помещать их в отдельный ArrayList (errorProneNames), который содержит ошибки. Может ли кто-нибудь помочь мне с частью удаления?Удаление строки из ArrayList

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>(); 


} 

}

ответ

2

Если это «как удалить элемент из ArrayList<>» части, которая вызывает проблемы, и вы хотите, чтобы проверить все значения, вы, вероятно, хотите использовать Iterator и вызвать remove на том, что:

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, это другое дело , Я подозреваю, что вы хотите использовать регулярное выражение, чтобы проверить, что имя содержит только буквы, пробелы, дефисы и, возможно, апострофы, но вы должны тщательно подумать о точно, что вы хотите здесь. Таким образом, вы могли бы Требуются:

private static boolean isErrorProne(String name) { 
    return !name.matches("^[a-zA-Z \\-']+$"); 
} 

Обратите внимание, что это не справится с диакритическими знаками, например. Возможно, это нормально для вашей ситуации - возможно, это не так. Вам нужно точно определить, что вы хотите разрешить, и соответствующим образом скорректировать регулярное выражение.

Вы также можете рассмотреть его выражение в терминах ли что-то есть хорошего имя, а не является ли это именем плохо - особенно, если вы используете последний подход создания нового списка хороших имен.

+0

Спасибо, тонна! часть («^ [a-zA-Z \\ - '] + $"); был там, где я вообще не знал. – Joey

+0

@Joey: В будущем стоит попытаться изолировать ваш вопрос, чтобы он * просто * о той части, в которой вам нужна помощь. Если вы уже были довольны частью удаления, было бы лучше написать вопрос * просто * в терминах «Как проверить, что строка содержит только те символы, которые я хочу?» –

+0

Да, это имеет смысл, я сожалею об этом. – Joey

1

Вы можете использовать метод удаления() из ArrayList

personalNames.remove("stringToBeRemoved"); 

Лот перегруженных методов доступны. Вы можете удалить с помощью индекса, объекта (сама строка) и т. Д. Вы можете увидеть Javadocs для получения дополнительной информации.

Кроме того, чтобы удалить всю строку, имеющую ничего, кроме букв -z, вы можете использовать регулярное выражение. Логика заключается в следующем

String regex = "[a-zA-Z]*"; 
    String testString = "abc1"; 
    if(!testString.matches(regex)){ 
     System.out.println("Remove this"); 
    } 

Как Джон отметил, в то время как итерация по списку, не используйте метод Удаление из списка() в но итераторы удалить() метод.

+0

Вы не ответили на вопрос о Ops. – Prabhakaran

+0

Да. Но я не знаю, как удалить все строковые вводы, в которых есть числа/символы. – Joey

+0

Обратите внимание, что если вы сделаете это, итерации по коллекции, это вызовет исключение. –

1

Вот ваше решение:

String regex = "[a-zA-Z]*"; 
for (String temp : personalNames) { 
    if (!temp.matches(regex)){ 
     errorProneNames.add(temp); 
     personalNames.remove(temp); 
    } 
} 
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(); 
     } 
    } 
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()). Это позволит вам идти вперед.

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")); 
} 
0

получить итератор из списка, в то время как ITR имеет следующий элемент передать его методу, например isNotProneName, который принимает строку и возвращает истинное или ложное, если соответствует данная строка не ваши потребности. if false return удалить строку из itr и добавить ее в другой список

Смежные вопросы