LISTA_DE_NOMES = new ArrayList<String>() como definir tamanho?
14 respostas
J
Jonas_backer
Precisaria definir um tamanho para a quantidade que vai ser armazada, no ArrayList para LISTA_DE_NOMES não ser maior que 5, como fazer isso usando como gancho a rotina for na iteração , para LISTA_DE_NOMES.size(5) essa definição não compila , e para private static List LISTA_DE_NOMES = new ArrayList(5); ele não termina a lista nesse tamanho !!!
private static List<String> LISTA_DE_NOMES = new ArrayList<String>();
public ServidorSocket(Socket socket) {
this.conexao = socket;
}
public boolean armazena(String newName) {
for (int i = 0; i < LISTA_DE_NOMES.size(); i++) {
if (LISTA_DE_NOMES.get(i).equals(newName))
return true;
}
LISTA_DE_NOMES.add(newName);
return false;
Sim, mas preciso usar um public para definir o metodo e um for para determinar o tamanho , de forma que foi feio com boolean para LISTA_DE_NOMES
E
entanglement
Você pode derivar uma classe a partir de ArrayList, de modo que ela tenha uma limitação no método add. Um dos construtores dessa classe derivada de ArrayList seria esse tamanho máximo.
Insere um contador que se incremente a cada inserção, se o número for maior que o desejado, ele não inclui.
J
Jonas_backer
entanglement:
Você pode derivar uma classe a partir de ArrayList, de modo que ela tenha uma limitação no método add. Um dos construtores dessa classe derivada de ArrayList seria esse tamanho máximo.
[size=18] private static List LISTA_DE_NOMES = new ArrayList(5);[/size] Aqui eu fixei o tamanho de 5 elementos , entretanto preciso passar um metodo para correr em LISTA_DE_NOMES para que ela não passa na iteração de 5 elementos.
Pelo que imagino, você está usando programação por tentativa e erro, o que nem sempre funciona.
Esse parâmetro numérico (5) NÃO SERVE para estipular o tamanho máximo. Ele serve para indicar a capacidade inicial, ou seja, quantos elementos vazios ele pode deixar já reservados em um array interno de objetos que ele mantém. Isso é feito para otimizar a velocidade de inserção de elementos, não a limitar a quantidade como você quer.
Pelo que imagino, você está usando programação por tentativa e erro, o que nem sempre funciona.
Esse parâmetro numérico (5) NÃO SERVE para estipular o tamanho máximo. Ele serve para indicar a capacidade inicial, ou seja, quantos elementos vazios ele pode deixar já reservados em um array interno de objetos que ele mantém. Isso é feito para otimizar a velocidade de inserção de elementos, não a limitar a quantidade como você quer.
Eu acho que pra tamanho não precisaria percorrer a lista então talvez o exemplo me sirva de modelo !!!
/** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. */privatetransientObject[]elementData;/** * The size of the ArrayList (the number of elements it contains). * * @serial */privateintsize;/** * Constructs an empty list with the specified initial capacity. * * @param initialCapacity the initial capacity of the list * @throws IllegalArgumentException if the specified initial capacity * is negative */publicArrayList(intinitialCapacity){super();if(initialCapacity<0)thrownewIllegalArgumentException("Illegal Capacity: "+initialCapacity);this.elementData=newObject[initialCapacity];}/** * Constructs an empty list with an initial capacity of ten. */publicArrayList(){this(10);}
D
drsmachado
Jonas backer:
drsmachado:
Use Array
StringlistaDeNomes[]=newString[5];
Sim, mas preciso usar um public para definir o metodo e um for para determinar o tamanho , de forma que foi feio com boolean para LISTA_DE_NOMES
Se você raciocinar um pouco, perceberá que pode fazer mais do que apenas determinar um array, como eu disse.
Questão de simples lógica, mas, claro, você não quer pensar.
Todo array possui um atributo chamado length, que indica o total de elementos. Mas tudo bem, é gastar latim a toa…
J
Jonas_backer
[size=18]Essa implementação esta errada ????[/size]
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintStream;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.*;publicclassServidorSocketextendsThread{privatestaticMap<String,PrintStream>MAP_CLIENTES;privateSocketconexao;privatetransientObject[]elementData;privateStringnomeCliente;privateintsize;privatestaticList<String>LISTA_DE_NOMES=newArrayList<String>();publicServidorSocket(Socketsocket){this.conexao=socket;}publicvoidArrayList(intinitialCapacity){super();if(initialCapacity<0)thrownewIllegalArgumentException("Illegal Capacity: "+initialCapacity);this.elementData=newObject[initialCapacity];// Constructs an empty list with an initial capacity of ten. publicvoidArrayList(){this(5);}publicbooleanarmazena(StringnewName){for(inti=0;i<LISTA_DE_NOMES.size();i++){if(LISTA_DE_NOMES.get(i).equals(newName))returntrue;}LISTA_DE_NOMES.add(newName);returnfalse;}publicvoidremove(StringoldName){for(inti=0;i<LISTA_DE_NOMES.size();i++){if(LISTA_DE_NOMES.get(i).equals(oldName))LISTA_DE_NOMES.remove(oldName);}}publicstaticvoidmain(Stringargs[]){MAP_CLIENTES=newHashMap<String,PrintStream>();try{ServerSocketserver=newServerSocket(5555);System.out.println("ServidorSocket rodando na porta 5555");while(true){Socketconexao=server.accept();Threadt=newServidorSocket(conexao);t.start();}}catch(IOExceptione){System.out.println("IOException: "+e);}}publicvoidrun(){try{BufferedReaderentrada=newBufferedReader(newInputStreamReader(this.conexao.getInputStream()));PrintStreamsaida=newPrintStream(this.conexao.getOutputStream());this.nomeCliente=entrada.readLine();if(armazena(this.nomeCliente)){saida.println("Este nome ja existe! Conecte novamente com outro Nome.");this.conexao.close();return;}else{//mostra o nome do cliente conectado ao servidor System.out.println(this.nomeCliente+" : Conectado ao Servidor!");//Quando o cliente se conectar recebe todos que estão conectados saida.println("Conectados: "+LISTA_DE_NOMES.toString());}if(this.nomeCliente==null){return;}//adiciona os dados de saida do cliente no objeto MAP_CLIENTES //A chave será o nome e valor o printstream MAP_CLIENTES.put(this.nomeCliente,saida);String[]msg=entrada.readLine().split(":");while(msg!=null&&!(msg[0].trim().equals(""))){send(saida," escreveu: ",msg);msg=entrada.readLine().split(":");}System.out.println(this.nomeCliente+" saiu do bate-papo!");String[]out={" do bate-papo!"};send(saida," saiu",out);remove(this.nomeCliente);MAP_CLIENTES.remove(this.nomeCliente);this.conexao.close();}catch(IOExceptione){System.out.println("Falha na Conexao... .. ."+" IOException: "+e);}}/** * Se o array da msg tiver tamanho igual a 1, então envia para todos * Se o tamanho for 2, envia apenas para o cliente escolhido */publicvoidsend(PrintStreamsaida,Stringacao,String[]msg){out:for(Map.Entry<String,PrintStream>cliente:MAP_CLIENTES.entrySet()){PrintStreamchat=cliente.getValue();if(chat!=saida){if(msg.length==1){chat.println(this.nomeCliente+acao+msg[0]);}else{if(msg[1].equalsIgnoreCase(cliente.getKey())){chat.println(this.nomeCliente+acao+msg[0]);breakout;}}}}}}
V
ViniGodoy
Tópico movido para Java Avançado.
W
William_Ricardo
Não quer que passe de 5 ? Use size ou length, e pronto.
O parâmetro “backlog” (que habitualmente é 5) não serve para determinar o número máximo de clientes conectados a um determinado servidor.
Ele serve apenas para determinar o tamanho de uma fila que o sistema operacional pode ter, ou não, para atender a uma solicitação pendente para conexão a esse socket. Pode ser que seu sistema operacional nem obedeça a esse parâmetro “backlog” e vá aceitando as conexões sem dó nem piedade - e você é que tem de se virar depois para atender a essas solicitações de conexões ou não.
O parâmetro "backlog" (que habitualmente é 5) não serve para determinar o número máximo de clientes conectados a um determinado servidor.
Ele serve apenas para determinar o tamanho de uma fila que o sistema operacional pode ter, ou não, para atender a uma solicitação pendente para conexão a esse socket. Pode ser que seu sistema operacional nem obedeça a esse parâmetro "backlog" e vá aceitando as conexões sem dó nem piedade - e você é que tem de se virar depois para atender a essas solicitações de conexões ou não.
classChatServer{publicstaticListclientList=newArrayList();publicstaticvoidmain(String[]args){try{ServerSocketserver=newServerSocket(5000,5);for(;;){//wait for client to connectSocketsocket=server.accept();System.out.print("A new client checked in: ");ClientHandlerclh=newClientHandler(socket);clientList.add(clh);clh.start();}}catch(Exceptione){System.out.println(e);}}}