Лучший способ отредактировать и изменить порядок всех элементов в PriorityBlockingQueue?

У меня есть очередь с приоритетами, и мне периодически нужно редактировать все элементы в ней, а затем переупорядочивать всю очередь. Вот простой код, иллюстрирующий одно из возможных решений.

package com.raby.shonguiz.zebi.test.collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;

import com.raby.shonguiz.zebi.test.CustomObject;

public class PriorityBlockingQueueTest {

    public static void main( String[] args ) throws InterruptedException {
        reorderQueue();
    }

    private static void reorderQueue() {
        int nbElements = 10;
        BlockingQueue<CustomObject> priorityBlockingQueue = createQueue( nbElements );
        Collection<CustomObject> col = new ArrayList<CustomObject>( priorityBlockingQueue.size() );
        priorityBlockingQueue.drainTo( col );
        for ( CustomObject cO : col ) {
            editElement( cO, nbElements );
            priorityBlockingQueue.add( cO );
        }
        pollQueue( priorityBlockingQueue );
    }

    private static void editElement( CustomObject cO, int nbElements ) {
        cO.setId( new Random().nextInt( nbElements ) );
    }



    public static BlockingQueue<CustomObject> createQueue( int nbItems ) {
        BlockingQueue<CustomObject> priorityBlockingQueue = new PriorityBlockingQueue<CustomObject>();
        for ( int i = 0; i < nbItems; i++ ) {
            Random rd = new Random();
            priorityBlockingQueue.add( new CustomObject( rd.nextInt( nbItems ) ) );
        }
        return priorityBlockingQueue;
    }

    public static void pollQueue( BlockingQueue<CustomObject> priorityBlockingQueue ) {
        while ( !priorityBlockingQueue.isEmpty() ) {
            System.out.println( priorityBlockingQueue.poll() );
        }
    }

}

И это класс CustomObject

package com.raby.shonguiz.zebi.test;

public class CustomObject implements Comparable<CustomObject> {

    long id;

    public CustomObject() {

    }

    public CustomObject( long id ) {
        this.id = id;
    }

    public long getId() {
        return id;
    }

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

    @Override
    public boolean equals( Object obj ) {
        if ( this == obj )
            return true;
        if ( obj == null )
            return false;
        if ( getClass() != obj.getClass() )
            return false;
        CustomObject other = (CustomObject) obj;
        if ( id != other.id )
            return false;
        return true;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append( "CustomObject [id=" );
        builder.append( id );
        builder.append( "]" );
        return builder.toString();
    }

    @Override
    public int compareTo( CustomObject o ) {
        return Long.compare( id, o.getId() );
    }
}

Итак, что я делаю, так это то, что я перетаскиваю очередь в коллекцию, затем редактирую все элементы из коллекции и вставляю их заново. Есть ли лучший способ (менее затратный по производительности) периодически редактировать и переупорядочивать все элементы PriorityQueue?

0 ответов

Другие вопросы по тегам