Возврат Итератора из метода - PullRequest
0 голосов
/ 13 сентября 2018

Я не могу печатать элементы в Iterator при возврате из метода removeTwos(). Я пытаюсь удалить элементы из списка, состоящего только из двух символов.

public class Main {

    public static void main(String[] args) {

        // write your code here
        List<String> list = new ArrayList<>();
        list.add("hi");
        list.add("what");
        list.add("who");
        list.add("ok");

        System.out.println(removeTwos(list));
    }

    public static String removeTwos(List<String> stringList) {

        Iterator<String> itr = stringList.iterator();
        for(int i = 0; i < stringList.size(); i++) {
            if(itr.hasNext() && itr.next().length() == 2) {
                itr.remove();
                System.out.println(itr.toString());
            }
        }
        return itr.toString();
    }
}

Спасибо.

Ответы [ 6 ]

0 голосов
/ 13 сентября 2018
public static String removeTwos(List<String> stringList){
    return stringList.stream()
            .filter(p -> p.length() != 2)
            .collect(Collectors.joining(", "));
}

возврат:

что, кто

0 голосов
/ 13 сентября 2018

Мне нравится использовать циклы for с итераторами:

public static void removeTwos(List<String> stringList) 
{
    for (Iterator<String> itr = stringList.iterator(); itr.hasNext();)
        if (itr.next().length() == 2) itr.remove();
}

public static void main(String[] args)
{
    String[] arr = { "hi", "what", "who", "ok" };
    List<String> list = new ArrayList<>(Arrays.asList(arr));
    removeTwos(list);
    System.out.println(list);
}   

Вывод:

[what, who]
0 голосов
/ 13 сентября 2018

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

Попробуйте этот код и посмотрите, работает ли он для вас:

public class JavaApplication255 {

    public static void main(String[] args) {
        // write your code here
        List<String> list = new ArrayList<>();
        list.add("hi");
        list.add("what");
        list.add("who");
        list.add("ok");

        removeTwos(list);
        System.out.println(list);
    }

    public static void removeTwos(List<String> stringList){

        for(int i = stringList.size() - 1; i >= 0 ; i--){
            String string = stringList.get(i);

            if (string.length() == 2){
                stringList.remove(string);
            }
        }
    } 
}
0 голосов
/ 13 сентября 2018

с использованием потока и фильтра легко 1 вкладыш, если вам не нужно использовать iter.

List<String> noTwos = list.stream().filter(s-> s.length() != 2).collect(Collectors.toList());
0 голосов
/ 13 сентября 2018

Чтобы использовать Iterator для этой проблемы, вы можете отредактировать свой метод removeTwos следующим образом:

public static String removeTwos(List<String> stringList) {

    Iterator<String> itr = stringList.iterator();
    while (itr.hasNext()) {
        String value = itr.next();
        if (value.length() == 2) {
            System.out.println(value);
            itr.remove();
        }
    }

    return stringList.toString();
}

При использовании Iterator безопасно удалить элементы изсписок пока проходит по нему. Вот ссылка , которая демонстрирует, что это безопасно.

0 голосов
/ 13 сентября 2018

Если вы хотите использовать цикл for(int idx..), а также удалять элементы, вы должны выполнять итерацию от конца к началу.

for(int idx=stringList.size()-1; idx>=0; idx--){
   String val = stringList.get(idx);
   if (val.length()==2)
      stringList.remove(idx);
}
...later if you want to print a list..
for(int idx=0; idx<stringList.size(); idx++) {
   System.out.println( String.format("%d:%s", idx, stringList.get(idx)) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...