Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

punkyep

Priority Qeue -.-

Recommended Posts

tenho o seguinte código:

package mext.maou.v2.tasks;

import it.gotoandplay.smartfoxserver.data.User;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.concurrent.ConcurrentHashMap;
import mext.maou.v2.world.World;
import net.sf.json.JSONObject;

public class WarzoneQueue implements Runnable {
    
    ConcurrentHashMap<String, PriorityQueue<User>> warzoneQueues = new ConcurrentHashMap<String, PriorityQueue<User>>();
    
    @Override
    public void run() {
        for(Map.Entry<String, PriorityQueue<User>> e : warzoneQueues.entrySet()) {
            PriorityQueue<User> pq = e.getValue();
            String warzone = e.getKey();
            if(pq.size() == 10) {
                JSONObject PVPI = new JSONObject();
                
                PVPI.put("cmd", "PVPI");
                PVPI.put("warzone", warzone);
                
                for(int i = 0; i < 10; i++) {
                    User user = pq.poll();
                    World.instance.sendResponse(new String[] {"server", "A new Warzone battle has started!"}, user);
                    World.instance.sendResponse(PVPI, user);
                }
            }
        }
    }
    
    private PriorityQueue<User> getWarzoneQueue(String warzone) {
        if(warzoneQueues.containsKey(warzone)) {
            return warzoneQueues.get(warzone);
        } else {
            warzoneQueues.putIfAbsent(warzone, new PriorityQueue<User>());
            return warzoneQueues.get(warzone);
        }
    }
    
    /**
     *
     * @param user
     */
    public void removeUserFromQueues(User user) {
        for(PriorityQueue<User> pq : warzoneQueues.values()) {
            pq.remove(user);
        }
    }
    
    /**
     *
     * @param warzone
     * @param user
     */
    public void queueUser(String warzone, User user) {
        PriorityQueue<User> pq = getWarzoneQueue(warzone);
        pq.offer(user);
    }
}

consigo compilar ele normalmente, porem, estou tendo um problema, com esse código o primeiro usuário é adicionado ou removido certinho, mas acima de 1 usuário eu recebo o seguinte erro:

Exception in ExtensionHandler: java.lang.ClassCastException: it.gotoandplay.smartfoxserver.data.User cannot be cast to java.lang.Comparable

Exception type: java.lang.ClassCastException
java.lang.ClassCastException: it.gotoandplay.smartfoxserver.data.User cannot be cast to java.lang.Comparable 
        at java.util.PriorityQeue.siftUpComparable<PriorityQeue.java:578>
        at java.util.PriorityQeue.siftUp<PriorutyQeue.java:574>
        at java.util.PriorityQeue.offer<PriorityQeue.java:274>
        at mext.maou.v2.tasks.WarzoneQeue.qeueUser<WarzoneQeue.java:69>

meu objetivo e o seguinte, criar uma sala para cada 10 usuários, porem os usuários só iriam entrar na sala se tivesse os 10 usuários .

 

alguém pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em Java você só pode estender uma classe, porém pode implementar n interfaces.

 

 

implements Runnable, Comparator

 

Quem precisa implementar Comparator é a classe User

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em Java você só pode estender uma classe, porém pode implementar n interfaces.

implements Runnable, Comparator

Quem precisa implementar Comparator é a classe User

eu não tenho acesso a classe User, teria outro método de eu fazer isto?, eu quero que a cada os 10 primeiros usuários entrem na sala, ou seja a cada 10 = uma nova sala para os 10.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.