powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / for в for
16 сообщений из 16, страница 1 из 1
for в for
    #40056807
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,

Есть объект " Office1 ", который содержит поля, и поля коллекции. Коллекциями может быть несколько полей.
Есть объект " Office2 ", это тот же самый объект что и " Office1 ", только некоторые поля называются по другому.

" Office1 " - основной объект, " Office2 " - изменения (обновления) к объекту " Office1 "

Общий пример описание классов " Office " :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public class Office{
	private String name;
	private List<Branch> branch;
}

public class Branch{
	private String nameBranch;
	private List<Employee> employee;
	private List<String> userValue;	
}

public class Employee{
	private String nameEmployee;
	private List<Integer> listInt;	
	private int count;
	private List<User> user;	
}

public class User{
	private String nameUser;
	private int count;
	private List<String> userValue;	
}



Можно представить объект "Office " как " XML " - древовидная структура и много вложенностей

Мне нужно сравнить " Office1 " и " Office2 ", и если какое-то поле отличается, то обновить его в " Office1 " из " Office2 "

я думаю сравнивать как-то так:
Код: java
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.
public static void main(String[] args){
		
		Office office1 = new Office();
		Office office2 = new Office();
		
		isEqual(office1, office2);	
	}	
		
	public boolean isEqual(Office office1, Office office2){
		
		if (office1 != null && office2 != null){
			
			List<Branch> listBranch1 = office1.getBranch();
			List<Branch> listBranch2 = office2.getBranch();
		
			for (Branch branch1 : listBranch1) {
				for (Branch branch2 : listBranch2) {
					if(branch1.getNameBranch != null && branch2.getNameBranch != null && branch1.getNameBranch.equals(branch2.getNameBranch)){
						
						List<Employee> listEmployee1 = branch1.getEmployee();
						List<Employee> listEmployee2 = branch2.getEmployee();
						
						for (Employee employee1 : listEmployee1) {
							for (Employee employee2 : listEmployee2) {
							   
							   if(employee1.getNameBranch != null && employee2.getNameBranch != null && employee1.getNameBranch.equals(employee2.getNameBranch)){
								   
								   List<User> listUser1 = employee1.getUser();
								   List<User> listUser2 = employee2.getUser();
								   
								   /**
								   * 
								   * и так далее...
								   *
								   */
								   								   
							   }
							}
						}
					}					  
				}
			}
		}
		 
	}	


Получается слишком много for в for

Как написать данный код более лаконично и быстро действенней?
...
Рейтинг: 0 / 0
for в for
    #40056809
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,
Но менее читабельней
...
Рейтинг: 0 / 0
for в for
    #40056811
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,
Разбей на функции если так приспичило
Код: java
1.
2.
for.....
    идемПоСтрокам() 
...
Рейтинг: 0 / 0
for в for
    #40056812
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

не не приспичило))

Хорошо, Спс!
...
Рейтинг: 0 / 0
for в for
    #40056815
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,

Знатно ты поклал на ооп. Надо для каждого класса сделать метод equals а там сравнивать списки сначала по длине, потом по содержимому. То, что ты пытаешься сделать - это позорная процедурщина, ООП евангелисты не за это умирали в интернет-срачах.
...
Рейтинг: 0 / 0
for в for
    #40056817
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks
быстро действенней?

Считай для каждого объекта хеш. Для списков полученые хеши сортируй, потом считай хеш из них. Так тебе не придётся идти в лоб и перебирать в двойном цикле.
...
Рейтинг: 0 / 0
for в for
    #40056818
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks
я думаю сравнивать как-то так:

переопределить в каждом из классов метод equals для того, чтобы он сравнивал свои поля и поля своей коллекции. в комбинации с org.apache.commons.collections4.CollectionUtils.isEqualCollection будет достаточно компактно

crutchmaster
Знатно ты поклал на ооп. Надо для каждого класса сделать метод equals а там сравнивать списки сначала по длине, потом по содержимому.

лол, я опоздал :)
...
Рейтинг: 0 / 0
for в for
    #40056819
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
for в for
    #40056820
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,

С Уважением!

Но там написано что, это хоть и похожие объекты, но все же они разного типа, названия и количество полей может отличаться.
...
Рейтинг: 0 / 0
for в for
    #40056822
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks
Но там написано что, это хоть и похожие объекты, но все же они разного типа, названия и количество полей может отличаться.

Я вижу, что у тебя там 2 поля - name и список объектов. Я не знаю, почему кто-то решил, что они разного типа и могут отличаться. В контексте явы это - один тип.
...
Рейтинг: 0 / 0
for в for
    #40056823
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя.. коммент вижу:
It does not answer to question. javers only shows difference, but does not provide information about field. – Mister_Jesus Feb 28 '20 at 13:14
Наверное не подойдёт. Ну в общем я бы порыл какие-то либы.
Ну или как-то написал через дженерики, тут надо подумать... потом, завтра )))
...
Рейтинг: 0 / 0
for в for
    #40056825
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks
Мне нужно сравнить " Office1 " и " Office2 ", и если какое-то поле отличается, то обновить его в " Office1 " из " Office2 "

Кстати зачем? Можно просто ничего не делать и считать, что office2 - это и есть office1. Или сколнировать office2. Какой смысл всё сравнивать?
...
Рейтинг: 0 / 0
for в for
    #40056828
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,

Это общий вид,

для понимания иерархии,

но в объекте "Office1" может быть доп поле а в объекте "Office2" его может не быть или на оборот,

и так по всем вложенным объектам.
...
Рейтинг: 0 / 0
for в for
    #40056830
Aleks_Aleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,

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

могут придти не корректные данные null, 0, ""

и еще нужно логать то на что пришло обновление
...
Рейтинг: 0 / 0
for в for
    #40056831
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks
но в объекте "Office1" может быть доп поле

Тогда у тебя Office1/2 не является классом Office, да и вообще ты вылез за возможности жабки, возьми лучше для такой задачи что-нибудь динамическое типа js или пистона. Там это делается на раз-два.
...
Рейтинг: 0 / 0
for в for
    #40056837
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_Aleks,
Есть шаблон Посетитель. Он ходит по объектам и чего нибудь там сравнивает или считает.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / for в for
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]