2016-11-15 3 views
0

私はの要素を["AA00001"、 "AA00005"、 "AA00005"、 "AA00003" ----- "ZZ00678"]から渡す必要があるという文字列arraylistを持っています。リストに表示されます。私はそのためのコードを書いており、必要な出力を生成している入力が少ないために必要です。しかし、私は22184個の要素を追加し、iはシーケンス内の不足要素を見つける方法は?

としてエラーを取得していArrayListの中に存在していない200個のユニークなIDを生成するいた場合にメインメソッドのコード(文字列[])を超えているが65535バイト

を制限します

誰かが助けてくれますか?

import java.util.ArrayList; 

public class GenerateIds 
{ 
    private static ArrayList<String> ids = new ArrayList<>(); 
    static int n=50; //no of Ids u want to generate 
    static int completed =0; 
    static char ID[] = new char[7]; 
    public static void main(String[] args) 
    { 
     ids.add("AA00001"); 
     ids.add("AA00004"); 
     ids.add("AA00007"); 
     generateIds(0); 
     for(String id : ids) 
     { 
      System.out.println(id); 
     } 
    } 


    private static void generateIds(int i) 
    { 
     if(n!=completed) 
     { 
      if(i<2) 
      { 
       for(char c ='A';c<'Z';c++) 
       { 
        ID[i]=c; 
        generateIds(i+1); 
       } 
      } 
      else if(i>=2 && i<7) 
      { 
       for(char c ='0';c<='9';c++) 
       { 
        ID[i]=c; 
        generateIds(i+1); 
       } 
      }else if(i==7) 
      { 
       String id = String.valueOf(ID); 
       if(!ids.contains(id)) 
       { 
        ids.add(id); 
        completed++; 
       } 
      } 
     } 
    } 
} 
+1

そのコードは間違いなく64kの制限を超えていません。それは[ideone上でうまくいく](http://ideone.com/MwiiUQ)。 –

+0

あなたのIDをテキストファイルに入れ、テキストファイルを読むことができます。 – matt

+0

あなたが 'ids.add(" AA00001 "); ids.add( "AA00004"); ids.add( "AA00007"); ... 'あなたのメインメソッドでは、大きすぎるため制限を簡単に超えます。すべてのIDを持つ外部ファイルを持ち、それをあなたのリストに読み込む方がよいでしょう。 – QBrute

答えて

0

あなたのIDをテキストファイルに入れることができます。次に、のようなものを使用してください。

List<String> ids = Files.readAllLines(Paths.get("ids.txt")); 
0

Javaでの方法は以上の65535のバイトを持つことはできません。

あなたはすべてやっているので、主な方法が大きくなりすぎているが、インラインを追加します。

ids.add("AA00001"); 
ids.add("AA00004"); 
ids.add("AA00007"); 
... 

これは、mainメソッドが長すぎるようになります。このようmattなどの他の読者が示唆したように

public void findMissingElements() { 

    List<String> missingIds = allPossibleIds.stream() 
              .filter(isMissingIn(existingIds)) 
              .collect(toList()); 

    //do something with the missingIds... 

} 

:あなたはこのを解決するために(と不足している要素を見つけるために)行うことができますして不足している要素を見つけるためにそれ以上のリストとループ内のすべての文字列値を入れています、あなたは、例えば、すべての文字列をファイルに入れ、ファイルを読み込みます。

私はそれがどのように連動するかを示す小さな例を書いた。あなたのgenerateIdsメソッドをjOOλで書き直してすべての可能なIDを生成し、それをallPossibleIdsに名前を変更しました(ただし、再帰的な方法も有効です)。私は例として検索時間を制限するために3桁の数字にIDを制限しました。

public class FindMissingIdsTest { 

    private List<String> allPossibleIds; 
    private List<String> existingIds; 

    @Before 
    public void setup() throws IOException { 
    allPossibleIds = allPossibleIds(); 
    existingIds = retrieveIdsFromSubSystem(); 
    } 

    @Test 
    public void findMissingElements() { 

    List<String> missingIds = allPossibleIds.stream() 
              .filter(isMissingIn(existingIds)) 
              .collect(toList()); 

    } 

    private Predicate<String> isMissingIn(List<String> existingIds) { 
    return possibleId -> !existingIds.contains(possibleId); 
    } 

    public List<String> allPossibleIds(){ 
    List<String> alphabet = Seq.rangeClosed('A', 'Z').map(Object::toString).toList(); 
    List<String> letterCombinations = Seq.seq(alphabet).crossJoin(Seq.seq(alphabet)).map(t -> t.v1 + t.v2).toList(); 
    List<String> numbericParts = IntStream.range(0, 1000) 
              .mapToObj(i -> String.format("%03d", i)) 
              .collect(toList()); 

    return Seq.seq(letterCombinations).crossJoin(Seq.seq(numbericParts)).map(t -> t.v1 + t.v2).toList(); 
    } 

    public List<String> retrieveIdsFromSubSystem() throws IOException { 
    return Files.readAllLines(Paths.get("ids.txt")); 
    } 

} 

もう一度あなただけ100000に1000年に変更し、%05D%の03Dできる5桁に変更します。

リストを注文することができれば、おそらくもっと速く、より良いアルゴリズムを見つけることができます。それはすべて状況によって異なります。例えば順序付きリストがある場合、すべてのIDのストリームを構築し、それを反復して、常にリソースを消費する代わりにポインタを使用して既存のリストに従うことができます。

関連する問題