У меня есть большой статический набор данные в памяти, в которой хранится следующие атрибуты людей:хранить все комбинации массива строк и поиск
[пол, возраст, расы, семейного-статус, образования, родную страна-, 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;
}
}
У кого-нибудь есть идея для более быстрого и лучшего способа сделать это?
Большое спасибо!
У вас есть пример кода? Очень сложно понять, что вы хотите сделать. – Blobonat
Существует только определенное количество способов генерации всех комбинаций требуемых данных. Нет быстрее, чем другие. Зачем тебе это нужно? И вы могли бы воспользоваться чем-то вроде SQLite? –
@Yazan Моя цель состоит в том, чтобы узнать, сколько раз существуют конкретные комбинации в наборе данных, но в конце я хочу добавить некоторый «шум», а также те, которые не существуют, получат ненулевое значение – ikro