Ищете элегантный способ поиска в массиве строк для повторяющихся записей.Метод грубой силы работает - PullRequest
0 голосов
/ 20 мая 2019

У меня есть файл буквенно-цифровых номеров VIN от транспортных средств (сохраняются в виде строк). Мне нужно разобрать этот файл и определить

1) Дублирован ли VIN? Если так, сколько раз

2) Запишите дублированный VIN и общее количество дубликатов в текстовый файл

Я заставил его работать, используя метод грубой силы с двойными вложенными циклами For. Ищу более элегантный способ разбора строк. Я использую Java 7 в NetBeans 8.2, и мне не нравится использование .set или hashmap.

Ограничения

1) VIN могут быть в любом порядке

2) Дубликаты могут быть случайно разбросаны по файлу

/ * a) Открыть входные и выходные файлы * /

        try {

        inputStream = new BufferedReader(new FileReader(fileName));//csv file
        outputStream = new PrintWriter(new FileWriter("DuplicateVINs.txt"));

/ * б) Читать в файл построчно затем вырежьте 17-значный VIN из дополнительных данных, которые мне не нужны * /

        while ((thisLine = inputStream.readLine()) != null) {
            l = thisLine.substring(1, 18);
            linesVIN.add(l.split(","));//why does this split have to be here?
        }

/ * c) Теперь, когда список заполнен, вычислите его размер и затем запишите в массив строк
* /

            String[][] inputArray = new String[linesVIN.size()][];
                             i=linesVIN.size();
                             System.out.println(i);
             linesVIN.toArray(inputArray);

/ * d) будет использовать два вложенных поля для поиска дубликатов * /

            countj=0;
            countk=0;

        for (int j = 1;j<=i-1; j++){ //j loop                  
            duplicateVIN=Arrays.toString(inputArray[j]);
                for(int k=1;k<=i-1;k++){
                  if(duplicateVIN.equals(Arrays.toString(inputArray[k]))){
                      countk=countk+1;
                      foundFlag=true;
                } else{
                      //
                      if(countk>=2){
                          //if(j!=k){
                           System.out.println(duplicateVIN + countk);    
                          //} // see if removes the first duplicate
                      }
                        foundFlag=false;
                        countk=0;
                    } 
                  } //ends k loop
                countj=j;

        } //ends j loop


       } //Completes the try 

[2q3CDZC90JH1qqqqq], 3

[2q4RC1NG1JR1qqqqq], 4

[2q3CDZC96KH1qqqqq], 2

[1q4PJMDN8KD1qqqqq], 7

1 Ответ

1 голос
/ 20 мая 2019

Я использую Java 7 в NetBeans 8.2, и мне не нравится использовать .set или hashmap.

Ваш первый шаг должен состоять в том, чтобы выяснить, что вы 'делаешь неправильно с картой.Хэш-карта является идеальным решением для этой проблемы, и это действительно то, что вы должны использовать.

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

Map<String,Integer> countMap = new HashMap<String,Integer>();
while ((thisLine = inputStream.readLine()) != null) {
        l = thisLine.substring(1, 18);

        if(countMap.containsKey(l)){
              countMap.put(l, countMap.get(l)+1);
        }else{
          countMap.put(l,1);
       }
    }

Я предполагаю, что предоставленный вами цикл while правильно перебирает все номера VIN.

После того, как этот цикл завершен, вам просто нужно будет вывести значения каждого ключа, подобно следующему:

 for(String vin : countMap.keySet()){
        System.out.println("VIN: "+vin+" COUNT: "+countMap.get(vin));
    }

Если я правильно прочитал вашу проблему, в этом нет необходимости.для вложенного цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...