поэтому я спрашивал раньше, но, похоже, я не совсем понял, о чем я говорю, поэтому сейчас я пытаюсь прояснить ситуацию: я пытаюсь подготовить данные для импорта.данные, которые я получаю, сделаны человеком не очень эффективно, поэтому я удаляю ненужные записи и пытаюсь объединить данные как можно больше.
это что-то вроде конфигуратора.данные, которые я получаю, выглядят примерно так:
123: 45: AB = 12 Это означает: если вариант 1 равен 1 или 2 или 3, а вариант 2 равен 4 или 5, а вариант 3 равен A или B, результатбудет 1 И 2
Я создал класс, который выглядит примерно так:
Class Options{
String opt1;
String opt2;
String opt3;
String optResult;
//and some other stuff
boolean hasSameOptions(Options o){
return opt1.equals(o.opt1) && opt2.equals(o.opt2) && opt3.equals(o.opt3);
}
public void AddOptions(String options) {
for (String s : options.split("")) {
if (!optResult.contains(s)) {
optResult = optResult + s;
}
}
}
}
Теперь данные повторяются и могут быть объединены.Например:
12 : 45 : AB = 12
12 : 45 : AB = 3
12 : 45 : AB = 4
Это на самом деле означает: 12: 45: AB = 1234
Итак, я делаю строки на части, чтобы получить только отдельные значения с результатом, дляпример:
1 : 4 : A = 12
1 : 4 : B = 12
1 : 5 : A = 12
//and so on.
Я составляю список всех этих значений и затем пытаюсь снова объединить их, чтобы получить более эффективный список.
Первый шаг, который я делаю, - это получить все объекты, которые имеютодинаковые параметры, но разные результаты и объединить результаты.это происходит следующим образом:
public static List<Options> cleanList(List<Options> oldList) {
List<Options> newList = new ArrayList<>();
for (Options item : oldList) {
Options temp = findEqualOptions(newList, item);
if (temp != null)
temp.AddOptions(item.optResult);
else
newList.add(item);
}
return newList;
}
public static <T> T findByProperty(Collection<T> col, Predicate<T> filter) {
return col.stream().filter(Objects::nonNull).filter(filter).findFirst().orElse(null);
}
public static Options findEqualOptions(List<Options> list, Options opt) {
return findByProperty(list, d -> d.hasSameOptions(opt));
}
После этого я пытаюсь сжать список еще больше, комбинируя элементы, которые имеют только ОДНУ другое значение.Например:
1 : 2 : A = 12
1 : 3 : A = 12
-> 1 : 23 : A = 12
я делаю это так:
for (int i = 0; i < list.size(); i++) {
for (int j = i + 1; j < list.size(); j++) {
Option o1 = list.get(i);
Option o2 = list.get(j);
int diff1 = 0;
int diff2 = 0;
int diff3 = 0;
int diff4 = 0;
if(!o1.opt1.equals(o2.opt1))
diff1 = 1;
if(!o1.opt2.equals(o2.opt2))
diff2 = 1;
//and so on
if((diff1+diff2+diff3+diff4)>1)
continue;
if(diff1 == 1)
o1.opt1 = o1.opt1 + o2.opt1;
//and so on...
list.remove(j--);
}
}
я делаю это до тех пор, пока больше не будет изменений.Работает хорошо, но медленно.особенно метод cleanList ().Кто-нибудь есть идеи, как сделать это лучше?я попытался использовать поток, чтобы получить весь список опций равенства, например, так:
public static <T> List<T> findByMultipleValue(Collection<T> col, Predicate<T> filter) {
return col.stream().filter(filter).collect(Collectors.toList());
}
public static List<Options> getEqualOptionsList(List<Options> optList, Options opt){
return findByMultipleValue(optList, o -> o.hasSameOptions(opt));
}
, но это сделало его намного медленнее.
PS.Это не полный код, просто пример того, что я пытаюсь сделать.Надеюсь, на этот раз все более понятно:)