Общее расширение Arraylist - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь переписать этот код из ответа в универсальное расширение ArrayList в Kotlin.

public  boolean equalLists(List<String> one, List<String> two){     
    if (one == null && two == null){
        return true;
    }

    if((one == null && two != null) 
      || one != null && two == null
      || one.size() != two.size()){
        return false;
    }

    //to avoid messing the order of the lists we will use a copy
    //as noted in comments by A. R. S.
    one = new ArrayList<String>(one); 
    two = new ArrayList<String>(two);   

    Collections.sort(one);
    Collections.sort(two);      
    return one.equals(two);
}

Я пришел с кодом ниже, но я получаю Unresolved reference: T

fun ArrayList<T>.equalLists(one: ArrayList<T>?, two: ArrayList<T>?): Boolean {
    if (one == null && two == null) {
        return true
    }

    if (one == null && two != null || one != null && two == null || one?.size != two?.size) {
        return false
    }

    val oneCopy = ArrayList(one)
    val twoCopy = ArrayList(two)

    oneCopy.sort()
    twoCopy.sort()

    return one == two
}

Как правильно реализовать это в Kotlin?

Ответы [ 3 ]

2 голосов
/ 17 апреля 2019

Я вижу, что вы нашли работоспособное решение, но я полагаю, что более идиоматическим решением Kotlin было бы определить это на самом интерфейсе List, а не конкретно ArrayList, и его также можно объявить как расширение для nullable List ссылки, эквивалентные исходному коду Java (который поддерживал два нулевых списка в качестве аргументов):

fun <T : Comparable<T>> List<T>?.containsSameElementsAs(other: List<T>?) = when {
    (this == null) xor (other == null) -> false // if only one is null
    (this?.size != other?.size) -> false // if both null, or have different sizes
    (this?.size == 1) -> this == other // avoid allocations for single element
    else -> this?.sorted() == other?.sorted()
}

Возможно, стоит подумать об использовании Set, если порядок не важен, а дубликаты не имеют смысла.

0 голосов
/ 17 апреля 2019

Наконец-то придумали универсальное расширение ArrayList для этого.

fun <T: Comparable<T>> ArrayList<T>.equalLists(other: ArrayList<T>?): Boolean {
    if (other == null) {
        return true
    }

    if ( size != other.size ) {
        return false
    }

    val thisCopy = ArrayList(this)
    val otherCopy = ArrayList(other)

    thisCopy.sort()
    otherCopy.sort()


    return thisCopy == otherCopy
}

Использование:

categories.equalLists(otherCategories)
0 голосов
/ 17 апреля 2019

Ниже приведен пример Обобщения в kotlin

Первый созданный пользовательский класс pojo с именем Product:

public class Product implements Serializable {

    int id;
    String mName;

    public Product(int id, String mName) {
        this.id = id;
        this.mName = mName;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getmName() {
        return mName;
    }

    public void setmName(String mName) {
        this.mName = mName;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Product product = (Product) o;
        return id == product.id;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

Затем добавьте приведенный ниже код в метод onCreate ():

val p1 = Product(1, "abc")
val p2 = Product(2, "abc")
val p3 = Product(3, "abc")
val p4 = Product(4, "abc")
val p5 = Product(5, "abc")

val p11 = Product(1, "abc")
val p22 = Product(12, "sdg")
val p33 = Product(3, "xfg")
val p44 = Product(14, "pqr")
val p55 = Product(5, "fhtryt")

val mProduList1 = ArrayList<Product>()
val mProduList2 = ArrayList<Product>()

mProduList1.add(p1)
mProduList1.add(p2)
mProduList1.add(p3)
mProduList1.add(p4)
mProduList1.add(p5)


mProduList2.add(p11)
mProduList2.add(p22)
mProduList2.add(p33)
mProduList2.add(p44)
mProduList2.add(p55)

equalLists(mProduList1, mProduList2)

Затем создайте универсальную функцию, названную «equalLists»:

public fun equalLists(one: ArrayList<*>?, two: ArrayList<*>?): Boolean {
    if (one == null && two == null) {
    return true
}

if (one == null && two != null || one != null && two == null || one?.size != two?.size) {
    return false
}

val oneCopy = ArrayList(one)
val twoCopy = ArrayList(two)

sortProduct(oneCopy)
sortProduct(twoCopy)


return one == two

}

Затем создайте новую функцию, которая будет приводить универсальный тип к продукту, а затем сортировать их:

private fun sortProduct(dummyCopy: ArrayList<Any>) {
    (dummyCopy as ArrayList<Product>).sortWith(object: Comparator<Product>{
        override fun compare(p1: Product, p2: Product): Int = when {
            p1.id > p2.id -> 1
            p1.id == p2.id -> 0
            else -> -1
        }
    })

    for(i in dummyCopy){
        Log.e("tagMine", "i.id is " + i.id + " i.mName " + i.mName)
    }
}

Чтобы определить универсальную функцию, мы можем выбрать одну из следующих, например, использовать «<*>» или «fun<T>», как показано ниже:

1) public fun equalLists(one: ArrayList<*>?, two: ArrayList<*>?): Boolean {

2) fun<T> equalLists(one: ArrayList<T>?, two: ArrayList<T>?): Boolean {

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...