3

セットや.contains()メソッドを使用せずに、リストから重複するアイテムを削除することになっているJavaのイントロコースの割り当ての質問に取り組んでいます。基本的には、イテレータと.equals()メソッドを使用するだけです。私のコードは次のとおりです。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


public class sample {
public static void main(String[] args) throws BadListException {
    List<String> myList = new ArrayList<String>();
    myList.add("A");
    myList.add("B");
    myList.add("B");
    myList.add("C");
    myList.add("B");
    myList.add("D");


    unique(myList);
    System.out.println(myList);


}
public static List<String> unique( List<String> items ) throws BadListException { 

    List<String> newList = new ArrayList<String>();
    Iterator<String> itr = items.listIterator();

    // If items is null, throw a BadListException. 

    if (items == null){
        throw new BadListException();
    }
    // If items is empty, return a new empty list. 

    if (items.isEmpty()){
        return newList;
    }

    // Otherwise create and return a new list that contains the items 
    // in L with all duplicates removed.  
    // Example: items: "A","B","C"              result: "A","B","C" 
    // Example: items: "A","A","A"              result: "A" 
    // Example: items: "A","B","B","C","A","D"  result: "A","B","C","D" 

    while (itr.hasNext()){
        for (int i = 0; i < items.size()-1; i++){
            if (itr.next().equals(items.get(i))){
                itr.remove();
            }
        }

    }
    items = newList;
    return newList;

誰かが私が間違っていることと、代わりにそれをどのように行うべきかを説明してくれるなら、それは非常に役に立ちます。これはテストの準備のためであるため、正しいコードではなく説明をいただければ幸いです。

4

10 に答える 10

5

何がうまくいかないのかを正確に説明するのではなく、デバッガーを使用して、プログラムが現在何を行っているかを確認することをお勧めします。特に、 を呼び出すたびにイテレータが何を返すかを確認してくださいiter.next()

正しい解決策のヒント:

  1. 複数のイテレータを使用する必要があります...
  2. 返すリストには何も入れていません。
  3. 新しいリストを作成して返すか、既存のリストから要素を削除するかを決める必要があります。両方を行うのは意味がありません。

将来、質問をするときは、プログラムが実際に行うべきことをより適切に説明する必要があります。例えば:

  • uniqueメソッドが引数リストから要素を削除することになっているのか、それとも一意の要素 (だけ) を含む新しいリストを返すことになっているのかはわかりません。
  • リスト内の要素の順序が重要かどうかは言いません。
  • 入力リストを変更してもよいかどうかはわかりません...またはそうではありません。

このような問題を解決する方法を決定するには、これらすべてが重要です。特に現実の世界では。あなたの課題がこれらのことを述べていなくても、あなたのコードがどのように機能することを意図しているかを自分で決める必要があります...そしてこれをjavadocコメントで文書化してください。

于 2013-03-03T01:24:21.277 に答える
3
  • i==0あなたのiterator.next()andget(i)が同じ要素になるとき、それを削除しただけです。
  • 同じリストの場合は、ループiterator.remove()内で実行しない方がよいでしょう。for
  • addに何もせずnewList、単純に返しました
  • この課題に対する提案:

最初にリストを並べ替えてから、要素が前の要素と等しい場合は要素を削除します。もちろん、必要に応じて、これらの一意の要素を保持する新しいリストを作成することもできます。

私の2セント

于 2013-03-03T01:28:47.317 に答える
1

リストを反復して要素を削除すると、リストが変更されます...要素「4」を見て、それを削除することにした場合、次に見る要素は何ですか? ヒント: 元の要素「5」ではなく、新しい要素「5」...

于 2013-03-03T01:23:57.213 に答える
0
code extract without using iterator 

import java.util.ArrayList;
import java.util.List;

  public class Test {
    final static List<String> str = new ArrayList<String>();
    public Test(){

        str.add("A");
        str.add("B");
        str.add("C");
        str.add("C");
        str.add("D");
        str.add("A");
        str.add("B");
        str.add("C");
        str.add("C");
        str.add("D");
        str.add("B");
        str.add("C");
        str.add("B");
        str.add("C");
        str.add("C");
        str.add("D");
        str.add("B");
        str.add("C");
        str.add("C");
        str.add("C");
        str.add("D");
        System.out.println(str);


    }

    public  List<String> rmovedDuplicate(List<String> str){

        List<String> finalList = new ArrayList<String>();

        for(int i =0; i<str.size();i++){
            for (int j=i+1; j<str.size();j++){
                if(str.get(i).equals(str.get(j))){
                    str.remove(j);
                    i=0;

                }
            }
        }

        System.out.println("final list :"+str);
        return str;
    }

    public static void main(String args[]){
        Test t = new Test();
        t.rmovedDuplicate(str);
    }

}
于 2013-03-19T06:56:43.053 に答える
0

とてもシンプル

way is ..first to check the list has that value if so ,skip adding it if not add the element and u get your unique list...instead of running intensive Iterator operation :)

Example

List<Integer> listOfUserIds = new ArrayList<Integer>();
     Integer UserIdCheck = 0;
     for (User userTest : userCollection) {
     UserIdCheck = userService.getUserByRegionCode(userTest.                      .getRegionId());
    if (!listOfUserIds.contains(UserIdCheck)) //check befor adding listOfUserIds.add(UserIdCheck);
        }
  } 
  return listOfUserIds.toString().replace("[", "").replace("]", ""); // if u like can remove [ and ] from the list and simply return a string like "4,5,6" 
于 2013-12-20T11:09:14.480 に答える
0

それを行う別の簡単な方法は次のとおりです。

import java.util.HashSet;
import java.util.List;
import java.util.Set;public class Main {

    /**
     * @param args
     */
    public static void main(String args[]) throws SQLException {
        System.out.println("Entered Main");
        Test();
        System.out.println(str);
        set.addAll(str);
        System.out.println(set);
        str.clear();
        str.addAll(set);
        System.out.println(str);
    }
    final static List<String> str = new ArrayList<String>();
    final static Set<String> set = new HashSet<String>();
    public static void Test(){

        str.add("A");
        str.add("B");
        str.add("C");
        str.add("C");
        str.add("D");
        str.add("A");
        str.add("B");
        str.add("C");
        str.add("C");
        str.add("D");
        str.add("B");
        str.add("C");
        str.add("B");
        str.add("C");
        str.add("C");
        str.add("D");
        str.add("B");
        str.add("C");
        str.add("C");
        str.add("C");
        str.add("D");
        System.out.println(str);
    }

リストにデータを入力するためのテスト方法は、Vidyarani Shinde の回答からコピーされます。

于 2013-03-19T07:30:29.920 に答える
-1

ArrayListが を実装ListADTし、ArrayListおよびArrayListIteratorクラスが期待どおりに実装され、BadListException引数のないコンストラクターによる未チェックの例外であると仮定します。また、null 要素がリストに追加されない可能性があると仮定します。

イテレータを使用して、以下に指定する Java メソッドを完成させる必要があります。私のソリューションは、次の要件を満たす必要があります。

  1. リストをトラバースするためにイテレータを明示的に使用する必要があります (つまり、for ループまたは Java の拡張 for ループを使用することはできません)。
  2. containsメソッドを使用してはならない
  3. を含め、オンライン リーディングに記載されている任意のListADT方法 ( を除く) を使用できますが、そこに記載されていない他の方法を使用してはなりません。containsListADT.iterator()List
  4. パラメータの内容を変更してはなりません。

関数のスケルトン:

public static ListADT<String> union(ListADT<String> list1, ListADT<String> list2) {
    // If list1 or list2 (or both list1 and list2) is null, throw a BadListException. 
    // If list1 and list2 are both empty, return a new empty list.
    // If list1 is empty (but not list2), return a new list containing the strings in
    //     list2 with all duplicates removed.
    // If list2 is empty (but not list1), return a new list containing the strings in
    //     list1 with all duplicates removed.
    // Otherwise, create and return a new list that contains the strings in list1 and
    //     the strings in list2 with all duplicates removed.
    //
    // Examples:
    //  list1: "a","b","c"          list2: "d","e","f"      result: "a","b","c","d","e","f"
    //  list1: "a","c","b","d"      list2: "e","d","a","f"  result: "a","c","b","d","e","f"
    //  list1: "a","b","c","b","a"  list2: "c","a","b"      result: "a","b","c"
    //
    // Note: the list returned does not need to be in any particular order

私のソリューションでは、ListADTオンライン リーディングで説明されているインターフェイスにあるメソッド (上記のイテレータ メソッドを含む) のみを使用するようにする必要があります。

これどうやってするの?

于 2016-06-18T22:53:32.280 に答える