So sánh 2 Arraylist

Array [“bắc”,“nam”,“đông”,“tây”]
Array [“nam”,“tây”]
em có 2 Array như trên… có cách nào để so sách array 2 với array 1 nếu thiếu cái nào thì sẽ add thêm vào array 2 ko ạ
kết quả em mong muốn kiểu như này [null,null,null,null,5,6,null,null]

    public BuildingDao findAllApartment(int idProject, int idSector) {
        BuildingDao building = new BuildingDao();
        // lây mảng phàn tử cần trong db
        List<Object[]> result = entityManager.createNativeQuery("SELECT DISTINCT a.id_apartment,a.floor,a.direction,a.sell_price,a.`status`,a.`name`,a.area from tbl_apartment a,tbl_project p,tbl_sector s,tbl_building b where a.id_building=b.id_building and b.id_sector=s.id_sector and p.id_project=s.id_project and p.id_project=:idProject and s.id_sector=:idSector  ORDER BY a.direction").setParameter("idProject", idProject).setParameter("idSector", idSector).getResultList();

        List<Apartment> list = new ArrayList<>();
        // dổ dữ lệu vào list Apartment
        for (Object[] obj : result) {
            Apartment apartment = new Apartment();
            apartment.setIdApartment(Integer.parseInt(obj[0].toString()));
            apartment.setFloor(Integer.parseInt(obj[1].toString()));
            apartment.setDirection(String.valueOf(obj[2]));
            apartment.setSellPrice(String.valueOf(obj[3]));
            apartment.setStatus(Integer.parseInt(obj[4].toString()));
            apartment.setName(String.valueOf(obj[5]));
            apartment.setArea(String.valueOf(obj[6]));
            list.add(apartment);
        }
        Map<String, List<Apartment>> sult = list.stream().collect(groupingBy(Apartment::getDirection));

        // đổ dữ liệu ra kq
        //lấy danh sach direction
        List<String> direction = new ArrayList<>(sult.keySet());
        System.out.println(direction);
        building.setDirections(direction);
        building.setNumberA(direction);
        // lay du lieu theo floor
        Map<Integer, List<Apartment>> map = list.stream().collect(groupingBy(Apartment::getFloor));


        List<Floor> floors = listFloor(map);
        System.out.println("lissta"+floors);


        for (int a=0;a<floors.size();a++) {
            //mot arrray rong de chen
            List<Apartment> ass = new ArrayList<>();
            System.out.println("a  "+a);
            // lay list floor
            Floor ab= (Floor) floors.get(a);
            // array list lay duoc tu database
            List<Apartment> apartmentList=add(ab);
            System.out.println(apartmentList);
            List<String> aa=new ArrayList<>();
            Map<String, Boolean> elementInArrB = new HashMap<>();
            for (int is = 0; is < apartmentList.size(); is++) {
                //lay tung direction trong list  apartmentlist
                aa.add(apartmentList.get(is).getDirection());
            }
            System.out.println("mang 2" + aa);
            for(int i = 0; i < aa.size(); i++) {
                elementInArrB.put(aa.get(i), true);
            }
            System.out.println("element"+elementInArrB);
//                System.out.println("as "+apartment);
                //duyet lay tung direction trong list direction o tren

                for (int i = 0; i < direction.size(); i++) {//duyet mang 1
                    if (elementInArrB.containsKey(direction.get(i)))
                        ass.add();
                    else
                        ass.add(addApartmeent());
                }
            ab.setList(ass);
        }
        building.setFloors(floors);
        Map<String,List<Apartment>> map2=list.stream().collect(groupingBy(Apartment::getArea));
        ArrayList<String> list2=new ArrayList<>(map2.keySet());
        building.setAres(list2);

        return building;
    }

Tạo 1 ArrayList mới xong rồi dùng for để duyệt hai mảng là được mà @@

1 Like

em cũng làm thế nhưng mà nó lại sinh ra nhiều hơn phần tử tối đa chỉ có trong list

Là sao, bạn thử đăng code của bạn lên đấy xem nào @@

 Map<String, List<Apartment>> sult = list.stream().collect(groupingBy(Apartment::getDirection));

    // đổ dữ liệu ra kq
    //lấy danh sach direction
    List<String> direction = new ArrayList<>(sult.keySet());
    System.out.println(direction);
    building.setDirections(direction);
    building.setNumberA(direction);
Map<Integer, List<Apartment>> map = list.stream().collect(groupingBy(Apartment::getFloor));
    List<Floor> floors = listFloor(map);
    System.out.println("lissta"+floors);
    for (int a=0;a<floors.size();a++) {
        //mot arrray rong de chen 
        List<Apartment> ass = new ArrayList<>();
        System.out.println("a  "+a);
        Floor ab= (Floor) floors.get(a);
        System.out.println("ab"+ab);
        List<Apartment> apartmentList=add(ab);
        System.out.println(apartmentList);
        for (int is = 0; is < apartmentList.size(); is++) {
            //lay tung direction trong list  apartmentlist
            Apartment apartment = apartmentList.get(is);
            System.out.println("as "+apartment);
            //duyet lay tung direction trong list direction o tren
            for (int j = 0; j < direction.size(); j++) {
                String dd = direction.get(j);
                System.out.println("dd"+dd);
                // check direction dd voi tung direction trong list aparment cua floor
                
                if (!(apartment.getDirection().equalsIgnoreCase(dd))) {
                    System.out.println("-----------");
                    ass.add(addApartmeent());.//add một apartment []
                } else {
                    ass.add(apartment);
                }
            }
        }
        ab.setList(ass);
    }
    building.setFloors(floors);

có phải do hàm if của em bị sai ko ạ

ai đó xem giúp em với

Dùng set ấy, nó sẽ loại phần tử trùng giúp rồi -.-

1 Like

Nếu không cần đúng thứ tự thì tất cả những phần tử nào có ở mảng 1 mà không có ở mảng 2 sẽ được thêm vào mảng 2.

Integer[] mang_1 = {1,2,3,4,5,6,7,8,9};
Integer[] mang_2 ={5,6};
List<Integer> list_1 = new ArrayList<>(Arrays.asList(mang_1));
List<Integer> list_2 = new ArrayList<>(Arrays.asList(mang_2));
list_1.removeAll(list_2);
list_2.addAll(list_1);
for (Integer item : list_2) {
	System.out.println(item); // Result: 5,6,1,2,3,4,7,8,9
}
1 Like

em cần theo thứ tự cơ a ạ

Bạn trả lời cho mình câu hỏi:

Có trường hợp nào mà mảng 2 có các phần tử không thuộc mảng 1 không?
Vd: 1,2,3,4,5,6,7,8,9
5,6,10
Nếu có, nó sẽ được sắp xếp như thế nào?

phần tử ở mảng 2 sẽ luôn chỉ có trong mảng 1 thôi ạ

Có lẽ mình chưa hiểu câu hỏi của bạn:

Input:
mảng 1: 1,2,3,4,5,6,7,8,9
mảng 2: 5,6

Output:
result: 1,2,3,4,5,6,7,8,9
hay : null,null,null,null,5,6,null,null,null

Nếu là trường hợp null,… thì mục đích là gì nhỉ

là như thế này ạ : null,null,null,null,5,6,null,null,null

Integer[] mang_1 = {1,2,3,4,5,6,7,8,9};
Integer[] mang_2 ={5,6};

List<Integer> list_1 = new ArrayList<>(Arrays.asList(mang_1));
List<Integer> list_2 = new ArrayList<>(Arrays.asList(mang_2));
List<Integer> resultList = new ArrayList<>();
for (Integer list_1_item : list_1) {
	boolean addVal = false;
	for (Integer list_2_item : list_2) {
		if (list_1_item.compareTo(list_2_item) == 0) {
			addVal = true;
			break;
		}
	}
	if (addVal) {
		resultList.add(list_1_item);
	} else {
		resultList.add(null);
	}
}
for (Integer item : resultList) {
	System.out.println(item); // null,null,null,null,5,6,null,null,null
}

Có thể xử lý nhanh hơn bằng stream nhưng mình cũng chưa rành cái này :v. It’s not the best but it works :slight_smile:

1 Like

2 câu này không cần thiết vì array thường cũng dùng kiểu for (Type element: array) đc

=>

for (Integer itemArray1: mang_1) {
    Integer foundResult= Arrays.stream(mang_2).filter(elm2 -> elm2.equals(itemArray1)).findFirst().orElse(null);
    resultList.add(foundResult);
}
1 Like

còn mình muốn trả về mảng 1 chỉ có nhũng phần tử của mảng 2?

@Hoang_Dinh_Le

public static void main(String[] args) {
	String[] arr1 = { "Đông", "Tây", "Nam", "Nam", "Bắc" };
	String[] arr2 = { "Đông", "Tây" };
	List<String> list = Arrays.asList(ArrayUtils.addAll(arr1, arr2));
	Set<String> set = new HashSet<>(list);
	System.out.println(Arrays.toString(set.toArray()));
}
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?