[ 
https://issues.apache.org/jira/browse/GROOVY-10964?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paul King updated GROOVY-10964:
-------------------------------
    Description: 
In List.minus() is a n*LOG\(n) version for comparable objects. Only for 
numbers, there is a dedicated slower n^2*LOG\(n) version. Is there a reason for 
this? It exists since 2.4.0 and hasn't changed much since then. Here is part of 
the code from version 4.0.9:

 
{code:java}
// if (nlgnSort && (head instanceof Comparable)) {
    //n*LOG(n) version
    Set<T> answer;
    if (head instanceof Number) {
        answer = new TreeSet<>(comparator);
        answer.addAll(self1);
        for (T t : self1) {
            if (t instanceof Number) {
                for (Object t2 : removeMe1) {
                    if (t2 instanceof Number) {
                        if (comparator.compare(t, (T) t2) == 0)
                            answer.remove(t);
                    }
                }
            } else {
                if (removeMe1.contains(t))
                    answer.remove(t);
            }
        }
    } else {
        answer = new TreeSet<>(comparator);
        answer.addAll(self1);
        answer.removeAll(removeMe1);
    }

    for (T o : self1) {
        if (answer.contains(o))
            ansCollection.add(o);
    }
} else {
    //n*n version {code}
I fail to see why the whole extra block for numbers beginning with
{code:java}
if (head instanceof Number) { {code}
is necessary.

 

  was:
In List.minus() is a n*LOG(n) version for comparable objects. Only for numbers, 
there is a dedicated slower n^2*LOG(n) version. Is there a reason for this? It 
exists since 2.4.0 and hasn't changed much since then. Here is part of the code 
from version 4.0.9:

 
{code:java}
// if (nlgnSort && (head instanceof Comparable)) {
    //n*LOG(n) version
    Set<T> answer;
    if (head instanceof Number) {
        answer = new TreeSet<>(comparator);
        answer.addAll(self1);
        for (T t : self1) {
            if (t instanceof Number) {
                for (Object t2 : removeMe1) {
                    if (t2 instanceof Number) {
                        if (comparator.compare(t, (T) t2) == 0)
                            answer.remove(t);
                    }
                }
            } else {
                if (removeMe1.contains(t))
                    answer.remove(t);
            }
        }
    } else {
        answer = new TreeSet<>(comparator);
        answer.addAll(self1);
        answer.removeAll(removeMe1);
    }

    for (T o : self1) {
        if (answer.contains(o))
            ansCollection.add(o);
    }
} else {
    //n*n version {code}
I fail to see why the whole extra block for numbers beginning with
{code:java}
if (head instanceof Number) { {code}
is necessary.

 


> List.minus() slow for Numbers
> -----------------------------
>
>                 Key: GROOVY-10964
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10964
>             Project: Groovy
>          Issue Type: Question
>          Components: groovy-jdk
>    Affects Versions: 2.4.0, 3.0.9, 4.0.9
>            Reporter: Ingo Wilms
>            Priority: Minor
>              Labels: Collections, Groovy, List, Number
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> In List.minus() is a n*LOG\(n) version for comparable objects. Only for 
> numbers, there is a dedicated slower n^2*LOG\(n) version. Is there a reason 
> for this? It exists since 2.4.0 and hasn't changed much since then. Here is 
> part of the code from version 4.0.9:
>  
> {code:java}
> // if (nlgnSort && (head instanceof Comparable)) {
>     //n*LOG(n) version
>     Set<T> answer;
>     if (head instanceof Number) {
>         answer = new TreeSet<>(comparator);
>         answer.addAll(self1);
>         for (T t : self1) {
>             if (t instanceof Number) {
>                 for (Object t2 : removeMe1) {
>                     if (t2 instanceof Number) {
>                         if (comparator.compare(t, (T) t2) == 0)
>                             answer.remove(t);
>                     }
>                 }
>             } else {
>                 if (removeMe1.contains(t))
>                     answer.remove(t);
>             }
>         }
>     } else {
>         answer = new TreeSet<>(comparator);
>         answer.addAll(self1);
>         answer.removeAll(removeMe1);
>     }
>     for (T o : self1) {
>         if (answer.contains(o))
>             ansCollection.add(o);
>     }
> } else {
>     //n*n version {code}
> I fail to see why the whole extra block for numbers beginning with
> {code:java}
> if (head instanceof Number) { {code}
> is necessary.
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to