2014-10-23 3 views
0

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

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

для простоты позволяет сказать, что мы имеем два массива с [ID, цена] пар

array1 = [id=A,price=1],[id=B,price=2],[id=C,price=3] 
array2 = [id=A,price=2],[id=B,price=1],[id=C,price=1] 

самый дешевый пакет, я могу сделать это за $ 2, комбинируя array1 [id A] и array2 [id B]
, но я также могу объединить array1 [id A] и array2 [id C], чтобы сделать пакет за 2 доллара.

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

например: (исключительно для целей визуализации):

package1 : 
    total : $2 
    1st option : 
     [id=A,price=1] 
    2nd option 
     [id=B,price=1] 
     [id=C,price=1] 

    package2 : 
    total : $3 
    1st option : 
     [id=A,price=1] 
    2nd option 
     [id=A,price=2] 

package3 : 
    total : $3 
    1st option : 
     [id=B,price=2] 
    2nd option 
     [id=B,price=1] 
     [id=C,price=1] 

и т.д.
Im предполагая, мне нужно будет рекурсивно перебирать результаты, я просто продолжать идти по неверному пути, и, может быть, кто-то может мне точку в правильном направлении.

ответ

0

Псевдокод для этого:

List<Package> results = new ArrayList<>(); 
for(Item item:array1) { 
    if (item.getPrice() < 2) { 
     addAllPackagesStartingWith(item, results); 
    } 
} 

// add all packages where an item from array 1 can be paired with an item in array 2 
void addAllPackagesStartingWith(Item item, List<Package> results) { 
    for (Item array2Item:array2) { 
     if(item.getPrice() + array2Item.getPrice() < 2) { 
      results.add(new Package(item, array2Item)); 
     } 
    } 
} 
+0

В ближайшее время я хочу поблагодарить вас за ваш быстрый ответ, я не уверен, почему он должен проверить, если цена меньше 2? – Fuzz

+0

Если цена в массиве1 больше 2, то пакет не может содержать до 2. Если цена в массиве 1 равна 2, то элемент из массива2 должен быть равен нулю в цене, равной 2 долларам или меньше. Я предположил, что вам понадобится пакет из двух предметов по одному от каждого ... –

1

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

Если вы используете пользовательский объект для своего класса (MyOption):

Map<Integer, Map<MyOption, List<MyOption>> result = new HashMap<>(); 

Или, если вы используете массив объектов:

Map<Integer, Map<Object[], List<Object[]>> result = new HashMap<>(); 
+0

Мне нравится этот вариант. Я вижу, что вы говорите. В ближайшее время я попробую попробовать. – Fuzz

1

Может быть, вы можете создать [цена] < -> [список позиций] карта, key - это цена, value - это список товаров по одной цене. например [1] -- [Item A, Item B], [2] -- [Item D, Item E, Item Z], то вы можете создать другую базу на карте.

private void methodToGenerateCombinationOfItems { 
    Map<Integer, List<Item>> map = new HashMap<Integer, List<Item>>(); 
    updateArrayDataToMap(map, array1); 
    updateArrayDataToMap(map, array2); 
    ... ... 
    // now the map should contains [price X] <--> [list of items with price X] 
    // if you want to order by price, you may want to use TreeMap instead of HashMap. 
} 

private void updateArrayDataToMap(Map<Integer, List<Item>> map, List<Item> itemArr) { 
    for(Item item : itemArr) { 
     if(map.contains(item.getPrice())) { 
      map.get(item.getPrice()).add(item); 
     } else { 
      List<Item> listTmp = new ArrayList<Item>(); 
      listTmp.add(item); 
      map.put(item.getPrice(), listTmp); 
     } 
    } 
} 
+0

Это большое спасибо, это дает мне отличную отправную точку. Я ценю время, которое вы приняли, чтобы ответить. – Fuzz

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