2016-08-21 5 views
2

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

[пол, возраст, расы, семейного-статус, образования, родную страна-, workclass , оккупация]

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

[[Мужской, Женский], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 , 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42 , 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67 , 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92 , 93, 94, 95, 96, 97, 98, 99, 100], [White, Asian-Pac-Islander, Amer-Indian-Eskimo, Other, Black], [Женат-civ-супруг (а), Разведен, Никогда не женат , Разлученный, Вдовец, Женат-супруг-отсутствует, Женат-AF-супруг], [Бакалавры, Некоторые колледжи, 11-й, HS-grad, Проф-школа, Assoc-acdm, Assoc-voc, 9th, 7th-8th, 12th , Магистратура, 1-й, 4-й, 10-й, докторанты, 5-6-й, дошкольные учреждения], [Соединенные Штаты, Камбоджа, Англия, Пуэрто-Рико, Канада, Германия, США (Гуам-США и др.), Индия, Греция, Су г-н, Китай, Куба, Иран, Гондурас, Филиппины, Италия, Польша, Ямайка, Вьетнам, Мексика, Португалия, Ирландия, Франция, Доминиканская Республика, Лаос, Эквадор, Тайвань, Гаити, Колумбия, Венгрия, Гватемала, Никарагуа, Таиланд, Югославия, Эль-Сальвадор, Тринадад & Тобаго, Перу, Гонконг, Голландия-Нидерланды], [Частный, Самостоятельный, не-инк, Самостоятельный, Федеральный, Городок, Штат-губернатор, Без оплаты, Безработные], [Техническая поддержка, Ремесло-ремонт, Другое-сервис, Продажи, Exec-managerial, Prof-speciality, Обработчики-уборщики, Аппаратные средства, Adm-clerical, Farming-fishing, Транспортно-двигательный, Приватно-обслуживающий, Защитный сержант, Вооруженные силы]]

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

Я попытался создать все возможные комбинации с использованием ArrayList строки String [] , но это займет несколько секунд, а затем поиск определенной комбинации с помощью indexOf (x), где x - String [], похоже, не работает.

public class Grid { 

// Immutable fields 
private final int combinationLength; 
private final String[][] values; 
private final int[] maxIndexes; 
private final ArrayList<String[]> GridValues = new ArrayList<String[]>(); 
// Mutable fields 
private final int[] currentIndexes; 
private boolean hasNext; 

public Grid(final String[][] array) { 
    combinationLength = array.length; 
    values = array; 
    maxIndexes = new int[combinationLength]; 
    currentIndexes = new int[combinationLength]; 

    if (combinationLength == 0) { 
     hasNext = false; 
     return; 
    } 

    hasNext = true; 


    // Fill in the arrays of max indexes and current indexes. 
    for (int i = 0; i < combinationLength; ++i) { 
     if (values[i].length == 0) { 
      // Set hasNext to false if at least one of the value-arrays is empty. 
      // Stop the loop as the behavior of the iterator is already defined in this case: 
      // the iterator will just return no combinations. 
      hasNext = false; 
      return; 
     } 

     maxIndexes[i] = values[i].length - 1; 
     currentIndexes[i] = 0; 
    } 

    while (hasNext()){ 
     String[] nextCombination = next(); 
     GridValues.add(nextCombination); 
    } 
} 


private boolean hasNext() { 
    return hasNext; 
} 


public String[] next() { 
    if (!hasNext) { 
     throw new NoSuchElementException("No more combinations are available"); 
    } 
    final String[] combination = getCombinationByCurrentIndexes(); 
    nextIndexesCombination(); 
    return combination; 
} 

private String[] getCombinationByCurrentIndexes() { 
    final String[] combination = new String[combinationLength]; 
    for (int i = 0; i < combinationLength; ++i) { 
     combination[i] = values[i][currentIndexes[i]]; 
    } 
    return combination; 
} 

private void nextIndexesCombination() { 

    for (int i = combinationLength - 1; i >= 0; --i) { 
     if (currentIndexes[i] < maxIndexes[i]) { 
      // Increment the current index 
      ++currentIndexes[i]; 
      return; 
     } else { 
      // Current index at max: 
      // reset it to zero and "carry" to the next index 
      currentIndexes[i] = 0; 
     } 
    } 
    // If we are here, then all current indexes are at max, and there are no more combinations 
    hasNext = false; 
} 
} 

У кого-нибудь есть идея для более быстрого и лучшего способа сделать это?

Большое спасибо!

+1

У вас есть пример кода? Очень сложно понять, что вы хотите сделать. – Blobonat

+1

Существует только определенное количество способов генерации всех комбинаций требуемых данных. Нет быстрее, чем другие. Зачем тебе это нужно? И вы могли бы воспользоваться чем-то вроде SQLite? –

+0

@Yazan Моя цель состоит в том, чтобы узнать, сколько раз существуют конкретные комбинации в наборе данных, но в конце я хочу добавить некоторый «шум», а также те, которые не существуют, получат ненулевое значение – ikro

ответ

1

Я делаю здесь предположение - я предполагаю, что данные не меняются (просмотр данных не похож на его динамику).

Я бы использовал локальную файловую базу данных HSQL для хранения данных (я выбрал это для целей скорости), но не стесняйтесь использовать это для формального дБ, например, MySQL).

Трюк для получения всех типов в разных измерениях находится в схеме. Для интеллектуального анализа данных «Star Schema» является предпочтительным подходом. Эта схема позволит вам группировать, рассчитывать на любое измерение, которое вы хотите.В вашем случае схема, вероятно, выглядеть следующим образом:

table person - columns(id (primary key), name, age, sex_id, country_id, highest_education_id, income) 
table sex - columns(id (primary key), name) 
table country - columns(id (primary key), name) 
table education - columns(id (primary key), name) 

Таким образом, если вы хотите, чтобы найти количество всех людей, которые из Колумбии, запрос будет, как:

select count(*) from people where country_id = <columbia country id> 

Вы можете сделать даже запросы более высокого порядка, такие как найти общий доход всех японских:

select country.name, sum(people.income) 
from people inner join country on people.country_id = country.id 
and country.name = "Japan" 

Его очень гибкий и расширяемый.

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