Поиск в дереве карт массивов

У меня есть древовидная карта массивов. Мне нужно проверить каждый список на наличие соответствующих элементов. Мой код работает, за исключением того, что он только проверяет массивы на единицы <=. Остальные массивы отслеживаются нормально. Я бы предположил, что это глупая ошибка, которую я пропускаю, но ..

            ArrayList<Integer> currentArray;
            ArrayList<Integer> compareArray;

            //Setting user friend list

              //cycle users "i"
              for(int i = 1; i <= treemap.size(); i++){
                currentArray = treemap.get(i);

                  //cycle user "k"
                    for(int k=1; k <= treemap.size(); k++){
                      //if (i!=k){  Put back in once working
                        compareArray = treemap.get(k);
                        //cylce "k"s movie list
                        for(int l=0; l < compareArray.size(); l++){
                          if (currentArray.contains(compareArray.get(l))){
                            if (treemap2.containsKey(i)){
                              ArrayList<Integer> list3 = treemap2.get(i);
                              list3.add(k);
                              treemap2.remove(i);
                              treemap2.put(i, list3);
                            }
                            if (!treemap2.containsKey(i)){
                              ArrayList<Integer> list4 =  new ArrayList<Integer>();
                              list4.add(k);
                              treemap2.put(i, list4);
                            }
                          }
                        }
                    }
              }
            //Create string of friends
            for(ArrayList<Integer>  x: treemap2.values()){
              str2 = Integer.toString(x.get(0));
              for (int i = 1; i < x.size(); i++) 
              {
                  str2 = str2 + "," + Integer.toString(x.get(i)) ;
              }      
            }

            context.write(key, new Text(str2));

Мне все еще нужно исправить ключ, это легко и не привыкать к финальной программе в любом случае.

я должен получать 1 1,1,1,2,2 2 1,1,2,2,2 3 2,3,3,3

Вместо этого я получаю 1 1,1,1 2 1,1,2,2,2 3 2,3,3,3

В любом случае, спасибо заранее. Примечание: выполнение нижеприведенного дает мне именно то, что я хочу... За исключением того, что последний массив не учитывается....!!

        //cycle current array "i"
        for(int i = 1; i < treemap.size(); i++){
          currentArray = treemap.get(i);
            //cycle compare array "k"
              for(int k=1; k <= treemap.size(); k++){
                if (i!=k){   //
                  compareArray = treemap.get(k);
                  //cylce array element in compare "l"
                  for(int l=0; l < compareArray.size(); l++){
                    if (currentArray.contains(compareArray.get(l))){
                      if (treemap2.containsKey(i)){
                        ArrayList<String> list3 = treemap2.get(i);
                        list3.add(k+":"+compareArray.get(l));
                        treemap2.remove(i);
                        treemap2.put(i, list3);
                      }
                      if (!treemap2.containsKey(i)){
                        ArrayList<String> list4 =  new ArrayList<String>();
                        list4.add(k+":"+compareArray.get(l));
                        treemap2.put(i, list4);
                      }
                    }
                  }
                }
              }
        }




1   2105
1   1953
1   1339
2   2105
2   1321
2   1339
3   1321
3   1544
3   1222

Я бы прошел через это с помощью своего отладчика, если бы он был завершен, но в начале и в конце отсутствует код. Например, я не вижу, как объявляется карта дерева. Можете ли вы опубликовать полный листинг кода?

Don 23.03.2019 03:19

Я добавил его, но... Он предназначен для работы с хаупом.

Hooch 23.03.2019 05:21

Не могли бы вы также дать мне список значений в каждом массиве вашей карты дерева, которые вы использовали для своего теста?

Don 23.03.2019 17:14

Фактические данные, которые у меня есть, намного больше, но сильно усеченные данные:

Hooch 23.03.2019 18:05

Я понимаю это :) достаточно, чтобы подтвердить ожидаемые входные и выходные данные.

Don 23.03.2019 18:06

Извините, я на машине и стараюсь добавить. Это часть фрагмента кода.

Hooch 23.03.2019 18:12

Давайте продолжить обсуждение в чате.

Don 23.03.2019 18:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Вы можете исправить любые неправильные предположения, которые я сделал о типах данных.

Надеюсь, это поможет.

package com.example.hadoop;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.TreeMap;

/**
 * I took your original code posting (which differs somewhat from the second
 * snippet) and I converted it into a stand alone Java program with mock test
 * data.
 * 
 * This program would be my starting point to finding the logic error.
 * 
 * My approach was to (1) isolate your algorithm, (2) mock out a minimal set of
 * input data to test just the algorithm, and (3) step through with the debugger
 * and/or use some trace statements.
 * 
 * I made assumptions about variable definitions based on the code and
 * information provided since I could not see all the actual definitions.
 * 
 * Some of your data types differ between your two code fragments so I was a bit
 * unsure about that.
 * 
 * I may be wrong on some of the variable definitions so modify these as needed.
 * 
 * You mentioned that:
 * 
 * Expected result: 1 1,1,1,2,2 2 1,1,2,2,2 3 2,3,3,3
 * 
 * Actual result: 1 1,1,1 2 1,1,2,2,2 3 2,3,3,3
 * 
 * Massively truncated test data: 1 2105 1 1953 1 1339 2 2105 2 1321 2 1339 3
 * 1321 3 1544 3 1222
 */
public class HadoopTestApp {

    /*
     * Mock test variables.
     */
    ArrayList<Integer> datalist1 = new ArrayList<Integer>(Arrays.asList(2105, 1953, 1339));
    ArrayList<Integer> datalist2 = new ArrayList<Integer>(Arrays.asList(2105, 1321, 1339));
    ArrayList<Integer> datalist3 = new ArrayList<Integer>(Arrays.asList(1321, 1544, 1222));
    TreeMap<Integer, ArrayList<Integer>> treemap = new TreeMap<Integer, ArrayList<Integer>>();
    TreeMap<Integer, ArrayList<Integer>> treemap2 = new TreeMap<Integer, ArrayList<Integer>>();
    String str2 = "";

    /**
     * Use the default constructor to complete the initialization of mock test
     * variables.
     */
    public HadoopTestApp() {

        treemap.put(1, datalist1);
        treemap.put(2, datalist2);
        treemap.put(3, datalist3);
    }

    /**
     * Bootstrap the test.
     * 
     * @param args Command line arguments are not currently used.
     */
    public static void main(String[] args) {
        new HadoopTestApp().run(args);
    }

    /**
     * If you prefer to trace variables manually. Or you can set some breakpoints
     * and inspect variables in the debugger.
     */
    public void doTrace(String label, Object o) {
        System.out.print(label + ": ");
        System.out.println(o);
    }

    /**
     * Run the test of Hooch's algorithm.
     * 
     * @param args Command line arguments are not currently used.
     */
    public void run(String[] args) {

        doTrace("treemap", treemap); // NEW

        ArrayList<Integer> currentArray;
        ArrayList<Integer> compareArray;

        // Setting user friend list

        // cycle users "i"
        for (int i = 1; i <= treemap.size(); i++) {
            currentArray = treemap.get(i);

            // cycle user "k"
            for (int k = 1; k <= treemap.size(); k++) {
                // if (i!=k){ Put back in once working
                compareArray = treemap.get(k);
                // cylce "k"s movie list
                for (int l = 0; l < compareArray.size(); l++) {
                    if (currentArray.contains(compareArray.get(l))) {
                        // NEW I set a debugger breakpoint on this line to inspect all variables
                        if (treemap2.containsKey(i)) {
                            ArrayList<Integer> list3 = treemap2.get(i);
                            list3.add(k);
                            treemap2.remove(i);
                            treemap2.put(i, list3);
                            doTrace("contains key, treemap2", treemap2); // NEW
                        }
                        if (!treemap2.containsKey(i)) {
                            ArrayList<Integer> list4 = new ArrayList<Integer>();
                            list4.add(k);
                            treemap2.put(i, list4);
                            doTrace("does not contain key, treemap2", treemap2); // NEW
                        }
                    }
                }
            }
        }

        // Create string of friends
        for (ArrayList<Integer> x : treemap2.values()) {
            str2 = Integer.toString(x.get(0));
            for (int i = 1; i < x.size(); i++) {
                str2 = str2 + "," + Integer.toString(x.get(i));
            }
            doTrace("in loop str2", str2); // NEW
        }

        // context.write(key, new Text(str2));
        doTrace("context.write str2", str2); // NEW

    }

}

Таким образом, единственная реальная разница здесь заключается в том, что «i <= treemap.size()» против «i <treemap.size()». И хотя я согласен, что это должно быть, это не работает. В вашем примере он ищет массив только для себя. Итак, 1[1], 2[1,2], 3[1,2,3]. с "i<" я получаю 1[1,2,3], 2[1,2,3], 3 никогда не запускается..

Hooch 23.03.2019 20:34

Мой пример — это всего лишь оболочка вокруг кода вашего исходного вопроса, и идея состоит в том, чтобы иметь отправную точку для уточнения моих предположений о типах данных и входных данных. Это не исправление, это просто мой подход, чтобы определить, где условная логика не работает должным образом, используя сочетание точек останова трассировки и отладки.

Don 23.03.2019 21:01

Да, алгоритм был правильным. Просто проблемы с распечаткой. Все еще есть проблема, но гораздо ближе. Спасибо.

Hooch 23.03.2019 23:25

Другие вопросы по теме