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

У меня два ArrayLists объектов и после сравнения я беру значение, которое имеет различие в зависимости от атрибута.

Так что в моем состоянии, когда deptCode то же самое в обоих списках, но deptName отличается, то вывод будет обновленным deptName.

Вот мой код.

public class educationMain {

    public static void main(String[] args) {
        
        List<person> list=new ArrayList<person>();  
        person l1 = new person(1,"Samual",100,"Sales","Business");
        person l2 = new person(2,"Alex",100,"Sales","Business");
        person l3 = new person(3,"Bob",101,"Engineering","Technology");
        person l4 = new person(4,"Michel",101,"Engineering","Technology");
        person l5 = new person(5,"Ryan",102,"PR","Services");
        person l6 = new person(6,"Horward",103,"Leadership","Managmnet");
        person l7 = new person(7,"Cyna",104,"HR","Human Resource");
        list.add(l1);  
        list.add(l2);  
        list.add(l3); 
        list.add(l4);  
        list.add(l5);  
        list.add(l6); 
        list.add(l7); 
        
        List<department> depList = new ArrayList<department>();
        
         department d1 = new department(100, "Sales","Business");
         department d2 = new department(101, "Engineering","Technology");
         department d3 = new department(102, "PR","Support");
         depList.add(d1);  
         depList.add(d2);  
         depList.add(d3); 

         List<person> listC = new ArrayList<person>();
         
         
         // My comparision Logic
         for(person p : list) {
             boolean  flag = false;
             for (department d:depList) {
                 if(p.deptCode == d.deptCode) {
                     if(p.deptName != d.deptName) {
                         p.deptName = d.deptName;
                         listC.add(p);
                     }
                 }
             }
         }
         
         for(person b:listC){  
             System.out.println(b.personId+" "+b.name+" "+b.deptCode+" "+b.parentDept+" "+b.deptName); 
         }
    }

}

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

5 Ryan 102 PR Support

Но есть ли у нас эффективный способ добиться этого вместо использования двух циклов for?

2 ответа
2

Обзор кода:

  • Используйте заглавные буквы в названиях классов
  • Будьте последовательны в форматировании: List<person> list=new ArrayList<person>() нет места вокруг =, но во всех других местах он есть. Также отступы несовместимы.
  • Именование переменных: имена должны указывать на конкретный объект. l1 вообще ничего не говорит. Кроме того, если они нигде не используются, вы можете опустить объявление переменных и сразу добавить их в список, например: someList.add(new Person(...)). list лучше называться personas и listC в виде personasWithMismatchedDepartmentName чтобы отразить их фактическое содержание.
  • flag внутренний цикл нигде не используется, его следует удалить
  • Комментарии вроде // My comparision Logic не несет никакой ценности читателю, лучше, если эта логика будет в отдельной методике.
  • Попробуйте уменьшить количество вложенных условий. Вместо
if(p.deptCode == d.deptCode) {
  if(p.deptName != d.deptName) { ... }  

лучше напиши

if(p.deptCode == d.deptCode && p.deptName != d.deptName) {...}

Улучшение алгоритма:

В вашем алгоритме есть O(number of personas) * O(number of departments) временная сложность. Вы можете уменьшить это до O(number of personas) если вы замените внутренний цикл поиском по хеш-таблице.

Мы можем создать хэш-карту от кода отдела к отделу, и вместо того, чтобы перебирать все отделы во внутреннем цикле, мы можем искать требуемый отдел по его коду. Псевдокод:

for (dept in departments):
  add mapping (deptCode, dept) to hashmap

for (p in personas):
  dept = hashmap.get(p.deptCode)
  if p.deptName != dept.name:
    p.deptName = dept.name
    add p to list

    Добро пожаловать на сайт!
    Я сомневаюсь, что есть гораздо лучшие способы делать то, что вы хотите здесь делать. Вам всегда придется сравнивать каждый элемент list каждому из depList. Базы данных должны делать подобные вещи, как это; вы можете попробовать выполнить повторный поиск в этом направлении (индекс, …), но для небольших проектов это нормально.
    В идеале вы должны настроить свои данные таким образом, чтобы подобные проблемы не могли возникнуть., это будет означать удаление информации об отделе от лиц и сохранение только идентификатора отдела.

    Кстати, классы (educationMain, person, department) всегда по соглашению начинаются с заглавной буквы. Вам также не хватает пробелов, но это легко исправить с помощью автоформатирования. В flag внутри внешнего цикла также не имеет смысла.

      Добавить комментарий

      Ваш адрес email не будет опубликован. Обязательные поля помечены *