2015-06-22 3 views
1

У меня возникли проблемы с выяснением того, как итератор может использоваться для замены элемента и подсчета количества замененных элементов. Это код, который я до сих пор:Как использовать итератор для замены и подсчета

public class example { 
    public static void main (String args[]){ 
     //create an ArrayList 
     ArrayList<String> list = new ArrayList<String>(); 


     //add elements to the array list 
     list.add("A"); 
     list.add("B"); 
     list.add("C"); 
     list.add("D"); 
     list.add("B"); 
     list.add("B"); 

     //use iterator to display original list 
     Iterator iter = list.iterator(); 
     while (iter.hasNext()){ 
      Object element = iter.next(); 
      System.out.println (element + " "); 
      } 

     // call replace   
     String b = "B"; 
     String x = "X"; 
     ArrayList<String> myList = new ArrayList<String>(); 
     replace (b, x, myList); 
    } 

    public static <E> int replace(E match, E replacement, ArrayList<E> myList) { 

     //throw exceptions if null 
      if (match == null){ 
       throw new IllegalArgumentException ("match cannot be null"); 
      } 
      if (replacement == null){ 
       throw new IllegalArgumentException ("replacement cannot be null"); 
      } 
      if (myList == null){ 
       throw new IllegalArgumentException ("myList cannot be null"); 
      } 
      //return 0 if myList is empty 
      boolean emptylist = myList.isEmpty(); 
      if (emptylist = true){ 
       System.out.println("0"); 
      } 


    } 

Я использовал итератор, чтобы распечатать элементы в списке, но теперь я должен использовать итератор для замены и возвращает количество замен. В этом случае я хочу заменить «B» на «X» и подсчитать количество «X». Я предполагаю, что я хочу поставить итератор в общем методе, но я не знаю, в каком направление голову в ...

ответ

1

Вы итерация по списку, и когда вы найти соответствующий элемент, вы set это с заменой:

public static <E> int replace(E match, E replacement, ArrayList<E> myList) { 

    //throw exceptions if null 
    if (match == null){ 
     throw new IllegalArgumentException ("match cannot be null"); 
    } 
    if (replacement == null){ 
     throw new IllegalArgumentException ("replacement cannot be null"); 
    } 
    if (myList == null){ 
     throw new IllegalArgumentException ("myList cannot be null"); 
    } 

    int counter = 0; 
    ListIterator<E> iter = myList.listIterator(); 
    while (iter.hasNext()) { 
     E val = iter.next(); 
     if (val.equals(match)) { 
      iter.set(replacement); 
      ++counter; 
     } 
    } 
    return counter; 
} 
+1

Почему вы используете 'iter.remove(); iter.add (замена); 'вместо' iter.set (replacement) '? (Каждый вызов 'iter.remove()' и 'iter.add' является линейным временем для' ArrayList', поэтому вы сделали весь алгоритм квадратичным ...) –

+0

@LouisWasserman хорошая точка. Не знаю, почему я над такими сложными вещами - отредактирован и исправлен. Благодаря! – Mureinik

+0

, когда я вносил изменения, описанные выше, по какой-то причине я до сих пор не могу заставить программу работать правильно ... Так как я назвал «заменить» в основном методе, не следует ли теперь заменить b на x? или я все еще что-то пропустил? спасибо за вашу помощь – joe

0

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

public class example { 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     ArrayList<String> list = new ArrayList<String>(); 

     //add elements to the array list 
     list.add("A"); 
     list.add("B"); 
     list.add("C"); 
     list.add("D"); 
     list.add("B"); 
     list.add("B"); 

     String b = "B"; 
     String x = "X"; 

     System.out.print(replace (b, x, list));    

    } 

    public static <E> int replace(E match, E replacement, ArrayList<E> myList) { 
     //throw exceptions if null 
      if (match == null || replacement == null || myList == null){ 
       throw new IllegalArgumentException ("match cannot be null"); 
      } 

      int i=0; 
      int replaceCount=0;    
      for(E str : myList){ 
       if(str.equals(match)){ 
        myList.set(i,replacement); 
        replaceCount++; 
       } 
       i++; 
      } 
     return replaceCount; 
     } 
}