У меня есть древовидная карта массивов. Мне нужно проверить каждый список на наличие соответствующих элементов. Мой код работает, за исключением того, что он только проверяет массивы на единицы <=. Остальные массивы отслеживаются нормально. Я бы предположил, что это глупая ошибка, которую я пропускаю, но ..
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
Я добавил его, но... Он предназначен для работы с хаупом.
Не могли бы вы также дать мне список значений в каждом массиве вашей карты дерева, которые вы использовали для своего теста?
Фактические данные, которые у меня есть, намного больше, но сильно усеченные данные:
Я понимаю это :) достаточно, чтобы подтвердить ожидаемые входные и выходные данные.
Извините, я на машине и стараюсь добавить. Это часть фрагмента кода.
Давайте продолжить обсуждение в чате.




Я немного не уверен в некоторых ваших определениях переменных и данных, потому что между двумя публикациями была некоторая разница. Однако я создал автономную программу на 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 никогда не запускается..
Мой пример — это всего лишь оболочка вокруг кода вашего исходного вопроса, и идея состоит в том, чтобы иметь отправную точку для уточнения моих предположений о типах данных и входных данных. Это не исправление, это просто мой подход, чтобы определить, где условная логика не работает должным образом, используя сочетание точек останова трассировки и отладки.
Да, алгоритм был правильным. Просто проблемы с распечаткой. Все еще есть проблема, но гораздо ближе. Спасибо.
Я бы прошел через это с помощью своего отладчика, если бы он был завершен, но в начале и в конце отсутствует код. Например, я не вижу, как объявляется карта дерева. Можете ли вы опубликовать полный листинг кода?