Lấy các phần tử không trùng nhau trong mảng

Anh chị cho e hỏi với a, trong python có hàm set() để lấy ra các giá trị trong list không lặp thì trong java có hàm nào thực hiện chức năng tương tự không ạ?
em cảm ơn trước ạ.

Không liên quan đến Java nhưng

bạn đang hiểu sai rồi.

https://docs.python.org/3/library/functions.html#func-set

class set([iterable])
Return a new set object, optionally with elements taken from iterable.

Trả về 1 object set, với element lấy ra từ iterable. iterable không nhất thiết phải là list.

>>> set((1, 2, 3, 4, 4, 3, 2, 5))  # tuple
{1, 2, 3, 4, 5}
>>> set(1, 2, 3, 4, 4, 3, 2, 5)
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    set(1, 2, 3, 4, 4, 3, 2, 5)
TypeError: set expected at most 1 arguments, got 8
>>> set({1, 2, 3, 4, 4, 3, 2, 5})  # set
{1, 2, 3, 4, 5}
>>> set([1, 2, 3, 4, 4, 3, 2, 5])  # list
{1, 2, 3, 4, 5}
>>> set(x % 7 for x in range(1, 9))  # comprehension
{0, 1, 2, 3, 4, 5, 6}

Vậy set object là cái gì?

https://docs.python.org/3/library/stdtypes.html#types-set

A set object is an unordered collection of distinct hashable objects.

Một thứ gì đó chứa các object hash được và phân biệt.

Như trong các ví dụ trên, kết quả trả về là 1 set object chứa các giá trị phân biệt trong các iterator nạp vào.

Thấy có distinct, hashable, thử search google qua 1 vòng:

Kết quả: Tống hết array vào HashSet<>. Tất cả những phần tử trong HashSet là các phần tử phân biệt của array.

Demo xem ở link trên.

Xem link dưới để biết cụ thể hơn về HashMap:

4 Likes

Vâng, cảm ơn ạ, :grinning:

Không có bạn ạ :frowning: Nhưng chúng ta có thể tự tạo một hàm để làm điều đó :smile:
Giả sử mình có một ArrayList<Integer> arr thì chúng ta có thể dùng cách này để tìm phần tử không trùng:

        for(int i : arr)
        {
            if(arr.indexOf(i) == arr.lastIndexOf(i))
            {
                // Bạn muốn làm gì ở đây thì làm :)
            }
        }

Giải thích:

  • arr.indexOf(i) sẽ trả về vị trí đầu tiên của phần tử i trong ArrayList arr .
  • arr.lastIndexOf(i) sẽ trả về vị trí cuối cùng của phần tử i trong ArrayList arr .

Vậy thì nếu arr.indexOf(i) == arr.lastIndexOf(i) thì có phải là vị trí đầu tiên trùng với vị trí cuối cùng ==> Phần tử đó chỉ xuất hiện 1 lần trong ArrayList arr :smile:

P/s: Cách của mình phải sử dụng ArrayList. Nếu bạn muốn dùng cho int[] thì sẽ phải chạy thêm vòng for để add phần tử vào ArrayList nhé :wink:

1 Like

Bỏ collection vào constructor của Set, tuỳ vào constructor dùng interface Comparable hay interface Comparator để hiện thực


Constructor của TreeSet, lấy từ JavaDocs

https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html


Danh sách vài class implement interface Collection

  • AbstractCollection
  • AbstractList
    • ArrayList
    • Vector
  • AbstractQueue
  • AbstractSet
    • EnumSet
    • HashSet
    • TreeSet
2 Likes

vâng, cảm ơn ạ, mk làm được r ạ,

vâng, cảm ơn ạ, mk làm được r ạ

1 Like

Theo mình thì tạo List trước sau đó chuyển List thành Set là ok à :slight_smile:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?