2016-11-15 5 views
0

У меня есть строчный архаист под тем, что мне нужно передать элементов из ["AA00001", "AA00005", "AA00003" ----- "ZZ00678"], и мне нужно сгенерировать элементы последовательности, которые не являются присутствующих в списке. Я написал для этого код, и для меньших входных данных он генерирует требуемый результат. Но когда я добавляю 22184 элементов и хотите, чтобы генерировать 200 уникальных идентификаторов, которые не присутствуют в ArrayList я получаю сообщение об ошибке, какКак найти недостающие элементы в последовательности?

Код метода основной (String []) превышает в 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. Он отлично работает на идеоне (http://ideone.com/MwiiUQ). –

+0

Вы можете поместить свой идентификатор в текстовый файл и прочитать текстовый файл. – matt

+0

Если вы делаете все 'ids.add (« AA00001 »); ids.add ("AA00004"); ids.add ("AA00007"); ... 'в вашем основном методе, он легко превышает предел, потому что он становится слишком большим. Было бы лучше иметь внешний файл со всеми идентификаторами и прочитать его в вашем списке. – QBrute

ответ

0

Вы можете поместить свой идентификатор в текстовый файл. Тогда используйте что-то вроде.

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

В Java а методы не могут иметь более 65535 байт.

Основной метод становится слишком большим, так как вы делаете все добавляет рядный:

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

Это сделает основной метод слишком долго. Что вы можете сделать, чтобы решить эту проблему (и найти недостающие элементы) это положить все строковые значения в списке и петля над ней, чтобы найти недостающие элементы:

public void findMissingElements() { 

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

    //do something with the missingIds... 

} 

Как и другие читатели, такие как matt предложенных , вы можете, например, поместите все строки в файл и прочитайте файл.

Я написал небольшой пример, чтобы показать, как все это будет работать вместе. Я переписал ваш метод generateIds с помощью jOOλ для генерации всех возможных идентификаторов и переименовал его в allPossibleIds (однако ваш рекурсивный метод тоже будет работать). Я ограничил идентификаторы номером цифры 3, чтобы ограничить время поиска в качестве примера.

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")); 
    } 

} 

Чтобы изменить на 5 цифр снова, вы можете просто изменить 1000 на 100000 и% 03d на% 05d.

Если вы можете заказать список, вы, вероятно, найдете более быстрый и лучший алгоритм. Все зависит от ситуации. например если у вас есть упорядоченный список, вы можете создать поток всех идентификаторов, перебрать его и следовать в существующем списке указателем, а не всегда потреблять ресурс .

Смежные вопросы