2017-01-17 12 views
0

1つの会社名のみを取得したいので、1回だけ取り出すことができます。すでにフェッチされている場合は、再度フェッチしないでください。ここで 重複しないランダムな文字列値を取得するにはどうすればよいですか?

はコードです:

private static String[] billercompanies = { 
    "1st",  
    "TELUS Communications", 
    "Rogers Cablesystems", 
    "Shaw Cable", 
    "TELUS Mobility Inc", 
    "Nanaimo Regional District of", 
    "Credit Union MasterCard", 
    }; 



public static String GetBillerCompany(){ 
    String randomBillerComp = ""; 
    randomBillerComp = (billercompanies[new Random().nextInt(billercompanies.length)]); 
    return randomBillerComp; 
} 
+2

アレイをシャッフルし、順番に繰り返します。あなたが(重複を忘れて)最初からやり直したいときは、もう一度シャッフルしてください – AxelH

+0

Aggree @AxelIH。 –

+0

@AxelHと記載しています。すでに使用した要素の削除を開始し、その範囲内の新しいインデックスを生成することもできます。しかし、それはAxelHソリューションよりも少し性能がかかります。だから私は彼の方が好きです。 – GAlexMES

答えて

1

ちょうどコレクション

を使用したい配列をシャッフル
Collections.shuffle(List); 

だから、単にその後、あなたの配列

List<E> list = Arrays.asList(array); 

からリストを作成し使用してシャッフル上記の方法

Collections.shuffle(list); 

リストはランダムなので左から右に読むことができます。 だから、単にインデックス

int currentIndex = 0; 

public E getRandom(){ 
    //If at the end, start over 
    if(++currentIndex == list.size()) { 
     currentIndex = 0; 
     shuffle(list); 
    } 

    return list.get(currentIndex); 
} 

あなたは既に使用されている複製リストを忘れるする各時間を節約する、単純にインデックスがないと、アレイ再び

Collections.shuffle(list); 

をシャッフル

あなたは、単に可能性毎回最初の値を削除し、リストが空になったら元の配列で再作成します。 Ole V.V.ポインタが外に出ると、Arrays.asList(E[])によって生成されたリストはremoveメソッドをサポートしないので、そこから新しいインスタンスを生成する必要があります。リストにコピーを作成したときに要素を削除

Integer[] array = {1,2,3,4,5}; 
RandomList<Integer> rl = new RandomList(array); 
int i = 0; 
while(i++ < 10) 
     System.out.println(rl.getRandom()); 
+0

最後のスニペットは機能しません。 'Arrays.asList()'によって返されるリストは固定サイズで(配列に裏打ちされている)、 'remove()'をサポートしていません。修正は 'list = new ArrayList(Arrays.asList(array));'と考えています。また、生の 'List'を使用したくない場合は、型パラメータを与えます。 –

+0

@ OleV.V。そう、私はこれを覚えている。確かにこれはうまくいくはずですが、いくつかのテストの後でこれを編集しますが、私は現時点で私のシステムにアクセスすることはできません。生の型については、まず型を避けようとしましたが、Objectの代わりに1つを指定するのを忘れました...私はいくつかの一般性を持ってそれを素早く編集しました。私はいくつかのテスト(そして家に帰る時間)を過ごした後、数時間後に再びこれを編集します。あなたにこれを入力していただきありがとうございます。 – AxelH

+0

@ OleV.V。実際には、コンストラクタ内のListのコピーで十分です。それはいつも覚えておくと良いです。 – AxelH

1

:ここ

は、このソリューションを使用して迅速かつ単純なクラスです:

public class RandomList<E>{ 
    E[] array; 
    List<E> list; 

    public RandomList(E[] array){ 
     this.array = array; 
     buildList(array); 
    } 

    public E getRandom(){ 
     if(list.isEmpty()) buildList(array); 
     return list.remove(0); 
    } 

    public void buildList(E[] array){ 
     list = new ArrayList<E>(Arrays.asList(array)); 
     Collections.shuffle(list); 
    } 
} 

そしてテストが、この小さなコードで行われましたそれはすでに取り出された。

Arrays.asList(array)は変更できませんが、フル機能のリストでラップできます。

List<String> billercompaniesList = new ArrayList<>(Arrays.asList(billercompanies)); 

String randomBillerComp = ""; 

Random random = new Random(); 
// first retrieval 
int index = random.nextInt(billercompaniesList.size()); 
randomBillerComp = billercompaniesList.get(index); 
billercompaniesList.remove(index); 


// second retrieval 
index = random.nextInt(billercompaniesList.size()); 
randomBillerComp = billercompaniesList.get(index); 
billercompaniesList.remove(index); 

// and so for  
+0

あなたは私の2番目の解決策を考えて、削除を使って考えました:) – AxelH

+0

私たちは車輪を再発明しません:) @AxelH – davidxxx

+0

私は一般的な解決策があると思います。 – AxelH

関連する問題