LISTA_DE_NOMES = new ArrayList<String>() como definir tamanho?

14 respostas
J

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;

14 Respostas

D

Use Array

String listaDeNomes[] = new String[5];
J

drsmachado:
Use Array

String listaDeNomes[] = new String[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

E

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.

Se o método add verificar que o arraylist já tem o tamanho máximo, poderia gerar uma IndexOutOfBoundsException: http://docs.oracle.com/javase/6/docs/api/java/lang/IndexOutOfBoundsException.html

F

Insere um contador que se incremente a cada inserção, se o número for maior que o desejado, ele não inclui.

J
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.

Se o método add verificar que o arraylist já tem o tamanho máximo, poderia gerar uma IndexOutOfBoundsException: http://docs.oracle.com/javase/6/docs/api/java/lang/IndexOutOfBoundsException.html


[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.

import java.util.Arrays;  
    import java.util.List;  
    import java.util.ArrayList;  
    public class StringArrayTest  
    {  
       public static void main(String[] args)  
       {  
          String[] words = {"ace", "boom", "crew", "dog", "eon"};  
       
          List<String> wordList = Arrays.asList(words);  
       
          for (String e : wordList)  
          {  
             System.out.println(e);  
          }  
       }  
    }
E

Você não leu o Javadoc da classe ArrayList?
http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html
(Não tem a desculpa da língua inglesa, porque o Google Translator ou o Microsoft Translator fazem um serviço razoável.)

http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList(int)

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.

J
entanglement:
Você não leu o Javadoc da classe ArrayList? http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html (Não tem a desculpa da língua inglesa, porque o Google Translator ou o Microsoft Translator fazem um serviço razoável.)

http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList%28int%29

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.
          */
         private transient Object[] elementData;
     
         /**
          * The size of the ArrayList (the number of elements it contains).
          *
          * @serial
          */
         private int size;
     
         /**
          * 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
          */
         public ArrayList(int initialCapacity) {
             super();
             if (initialCapacity < 0)
                 throw new IllegalArgumentException("Illegal Capacity: "+
                                                    initialCapacity);
             this.elementData = new Object[initialCapacity];
         }
     
        /**
          * Constructs an empty list with an initial capacity of ten.
          */
         public ArrayList() {
             this(10);
         }
D

Jonas backer:
drsmachado:
Use Array

String listaDeNomes[] = new String[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

[size=18]Essa implementação esta errada ????[/size]

import java.io.BufferedReader;  
    import java.io.IOException;  
    import java.io.InputStreamReader;  
    import java.io.PrintStream;  
    import java.net.ServerSocket;  
    import java.net.Socket;  
    import java.util.*;  
      
    public class ServidorSocket extends Thread {  
        private static Map<String, PrintStream> MAP_CLIENTES;  
        private Socket conexao;  
        
        private transient Object[] elementData;  
        private String nomeCliente;  
        private int size;  
        private static List<String> LISTA_DE_NOMES = new ArrayList<String>();  
        public ServidorSocket(Socket socket) {  
            this.conexao = socket;  
        }  
        public void ArrayList(int initialCapacity) {  
            super();  
            if (initialCapacity < 0)  
                throw new IllegalArgumentException("Illegal Capacity: "+  
                                                   initialCapacity);  
            this.elementData = new Object[initialCapacity];  
             
            // Constructs an empty list with an initial capacity of ten. 
                       
            public void ArrayList() {  
                this(5);  
            }  
        
        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;  
        }  
        public void remove(String oldName) {  
            for (int i = 0; i < LISTA_DE_NOMES.size(); i++) {  
                if (LISTA_DE_NOMES.get(i).equals(oldName))  
                    LISTA_DE_NOMES.remove(oldName);  
            }  
        }  
        public static void main(String args[]) {  
            MAP_CLIENTES = new HashMap<String, PrintStream>();  
            try {  
                ServerSocket server = new ServerSocket(5555);  
                System.out.println("ServidorSocket rodando na porta 5555");  
                while (true) {  
                    Socket conexao = server.accept();  
                    Thread t = new ServidorSocket(conexao);  
                    t.start();  
                }  
            } catch (IOException e) {  
                System.out.println("IOException: " + e);  
            }  
        }  
        public void run() {  
            try {  
                BufferedReader entrada = new BufferedReader(new InputStreamReader(this.conexao.getInputStream()));  
                PrintStream saida = new PrintStream(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 (IOException e) {  
                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 
         */  
        public void send(PrintStream saida, String acao, String[] msg) {  
            out:  
            for (Map.Entry<String, PrintStream> cliente : MAP_CLIENTES.entrySet()) {  
                PrintStream chat = 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]);  
                            break out;  
                        }  
                    }  
                }  
            }  
        }  
    }
V

Tópico movido para Java Avançado.

W

Não quer que passe de 5 ? Use size ou length, e pronto.

if(mapaOuLista.size() < 5){
//Faça o que tem que fazer...
}else{
//Indique a "lista cheia"...
}
J

William Ricardo:
Não quer que passe de 5 ? Use size ou length, e pronto.

if(mapaOuLista.size() < 5){ //Faça o que tem que fazer... }else{ //Indique a "lista cheia"... }


[size=18]Threads !!![/size]

ServerSocket server = new ServerSocket( 5000, 5 );
E

http://docs.oracle.com/javase/6/docs/api/java/net/ServerSocket.html#ServerSocket(int,%20int)

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.

J
entanglement:
http://docs.oracle.com/javase/6/docs/api/java/net/ServerSocket.html#ServerSocket%28int,%20int%29

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.

Fonte:SERVER SOCKETS IN JAVA

class ChatServer {
    public static List clientList = new ArrayList();                

    public static void main( String[] args ) {
        try {

           ServerSocket server = new ServerSocket( 5000, 5 );         
            for (;;) {
                //wait for client to connect
                Socket socket = server.accept();                    
                System.out.print(
                       "A new client checked in:   " );

                   ClientHandler clh =
                           new ClientHandler( socket );             
                   clientList.add( clh );                           
                   clh.start();                                     
              }
         }  catch(Exception e) { System.out.println(e); }
    }
}
Criado 28 de maio de 2012
Ultima resposta 31 de mai. de 2012
Respostas 14
Participantes 6