2017-01-13 8 views
0

ArrayListで一意の要素を見つけるためにforループを作成しようとしています。 私は既に012の場所(繰り返しが許可されている)のユーザー入力と一緒に格納されたArrayListを持っていますが、私は重複を除いてリストに入力された異なる場所の数を数える方法に固執しています。配列リスト内の一意の単語の数を見つける方法

[park, park, sea, beach, town] 

出力::私が作るしようとしているコードの

[Number of unique places = 4] 

HERESにラフ例:

public static void main(String[] args) { 

    ArrayList<City> place = new ArrayList(); 
    Scanner sc = new Scanner(System.in); 

    for(...) { // this is just to receive 20 inputs from users using the scanner 
    ... 
    } 

# This is where i am lost on creating a for loop... 

} 

入力を(私はハッシュを使用しないようしたいと思います)

+10

なぜハッシュセットを使用したくないですか?これは、この問題を扱う最も簡単でおそらく最も効率的な方法です。 –

+0

ハハええ、私は知っているけど、前にそれを見てみましたが、ハッシュをはっきりとはっきりと理解する方法はまだ分かりません。だから私はそれを使用してスクリプトをサミットして、私はそれがどのように動作するかを明確に説明することができるのではないかと疑う。 – brand

答えて

1

Setまたはハッシュ値を使用しない)1つ目の方法は、2番目のリストを作成することです。

ArrayList<City> places = new ArrayList<>(); 
//Fill array 

ArrayList<String> uniquePlaces = new ArrayList<>(); 
for (City city : places){ 
    if (!uniquePlaces.contains(city.getPlace())){ 
     uniquePlaces.add(city.getPlace()); 
    } 
} 

//number of unique places: 
int uniqueCount = uniquePlaces.size(); 

これは超効率的ではないことに注意してください= D

+0

これは私が2番目のリストに感謝していないものです!今、私は2つのリストを入れ子のforループを使ってif条件と比較することができます。 – brand

+0

@brand - いいえ、ネストされたループは使用しないでください。 'List'の' contains() 'メソッドを使うだけです。既にあなたのためにコード化されたループがあり、素敵な方法でパッケージ化されています。 –

5

あなたはそのためにセットを使用することができます。 https://docs.oracle.com/javase/7/docs/api/java/util/Set.html

リストデータをSetに格納します。 Setはその中に重複を持たないので、重複のない要素になります。

このメソッドを使用してサイズを設定します。 https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#size()

サンプルコード。

 List<String> citiesWithDuplicates = 
       Arrays.asList(new String[] {"park", "park", "sea", "beach", "town"}); 
     Set<String> cities = new HashSet<>(citiesWithDuplicates); 

     System.out.println("Number of unique places = " + cities.size()); 
+0

おそらく地図がこの問題の最も良い構造ですが、回答したい場合は少なくとも実装の詳細を提示する必要があります。 –

+0

@TimBiegeleisen - なぜマップはセットよりも優れていますか? –

+0

@TedHoppそれでは、なぜ上記の 'HashSet'を使うことをお勧めしましたか? –

1

あなたがSetまたはMapインタフェースの実装を使用する必要はありません(それはあなたに1行のコードで問題を解決するだろう)、あなたがArrayListで立ち往生したい場合、私はCollections.sort()法のようなものを使用することをお勧め。あなたの要素をソートします。次にソートされた配列を反復処理し、重複を比較してカウントします。このトリックは、反復問題を簡単に解決できるようにします。

とにかく、Setインターフェイスの実装の1つを使用することを強くお勧めします。

2

は、Java 8を使用することができるならば、あなたは、Javaのdistinct方法ストリームを使用することができます

int numOfUniquePlaces = list.stream().distinct().count(); 

をそれ以外の場合は、使用して設定が最も簡単です。 "ハッシュ"を使用したくないので、TreeSetを使用してください(ほとんどの場合、HashSetが良い解決策です)。それがオプションでもない場合は、各要素が重複しているかどうかを手動でチェックする必要があります。

0

以下の回答を使用してください。複数の重複要素がある場合、これは個別リスト内の最後の重複要素を追加します。まあ

List<String> citiesWithDuplicates = Arrays.asList(new String[] { 
       "park", "park", "sea", "beach", "town", "park", "beach" }); 
     List<String> distinctCities = new ArrayList<String>(); 

     int currentIndex = 0; 

     for (String city : citiesWithDuplicates) { 
      int index = citiesWithDuplicates.lastIndexOf(city); 
      if (index == currentIndex) { 
       distinctCities.add(city); 
      } 
      currentIndex++; 
     } 
      System.out.println("[ Number of unique places = " 
      + distinctCities.size() + "]"); 
0

あなたは、たとえば任意のHashSetsまたは同様のオプション、このようなforループのネストされた迅速かつ汚いを使用したくない場合は、アイテムをたくさん持っている場合トリックは(それは地獄のように単に遅いん(20はうまくいくでしょう)):

int differentCount=0; 
for(City city1 : place){ 
    boolean same=false; 
    for(City city2 : place){ 
     if(city1.equals(city2)){ 
     same=true; 
     break; 
     } 
    } 
    if(!same) 
     differentCount++; 
} 
System.out.printf("Number of unique places = %d\n",differentCount); 
+1

ええ、ちょっと遅いですが、2番目のリストのアイデアを作成してネストされたループで問題を解決しました。ありがとうございました。 – brand

関連する問題