Dúvida incluindo set e get

Olá galera… tenho uma dúvida… estou aki com o meu programa que lê uma string… verifico se o radical dessa string já existem em uma lista (axo q deveria ser uma lista de uma lista - mas axo q isso não existem neh? - então está sendo uma ArrayList) Bom… seguindo, c o radical não existe, tenho que criar uma nova posição e inserir o radical e a palavra em seguida. Se já existem tenho q inserir a palavra na lista dakele radical.

Exemplo, a palavra maravilhado, maravilhoso e fortemente. Pego o radical maravilha da primeira palavra q entra maravilhado, retiro seu radical - maravilha, existem alguma string parecida? não, então insiro esse radical - maravilha apontando pra palavra maravilhado. Pego a segunda string maravilhoso, seu radical maravilha, já existem um radical maravilha? sim… então nakela lista eu insiro maravilhoso. Pego a palavra fortemente, radical - forte, já existe radical forte? não, então… insiro ele numa nova posição apontando pra palavra fortemente.

Deu pra entender galera?

O problema é o seguinte… to usando set e get, aí fiquei na dúvida c to fazendo certo ou não.

–> Esse é meu código q chama a classe Cluster

[code]if(novoCluster.isNewRepresentative(key2)) //se não existir um cluster com radical
{
novoCluster.setRadical(key2); //seto o método setRadical com o nome radical

    			/*Cluster teste = new Cluster();
        		String pal = teste.getRadical();
				System.out.println("radical" + pal);*/
    			
    			
    			novoCluster.setPalavras(new ArrayList<String>()); //seto o método setPalavras com a palavra
    			ArrayList<String> clusteres = new ArrayList<String>(); //declaro e inicializo um vetor chamado clusteres
				clusteres.add(key2); //e add a palavra que está no novoCluster
				
    		}else//senão - se o radical já existir
    		  {
    			/*Cluster teste = new Cluster();
        		List<String> pal = teste.getPalavras();
				System.out.println("Get" + pal);*/
    			
    			Cluster clusterDoRadicalDesejado = new Cluster(); //declaro uma variável da classe Cluster
				List<String> palavrasDoCluster = clusterDoRadicalDesejado.getPalavras(); //declaro e inicialiço palavrasDoCluster com o método getPalavras do Cluster
				palavrasDoCluster.add(key2); // seto a palavra nova como sendo key2 - palavra do texto
    			clusterDoRadicalDesejado.setPalavras(palavrasDoCluster);       			
    		  }[/code]

–> Essa é minha classe Cluster

[code]package histograma;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Cluster {
private String radical;
private List palavras;
private String palavraRepresentante;

public String getPalavraRepresentante() {
	return palavraRepresentante;
}

public void setPalavraRepresentante(String palavraRepresentante) {
	this.palavraRepresentante = palavraRepresentante;
}

public String getRadical() {
	return radical;
}

public void setRadical(String radical) {
	this.radical = radical;
}

public List<String> getPalavras() {
	return palavras;
}

public void setPalavras(List<String> palavras) {
	this.palavras = palavras;
}

public boolean isNewRepresentative(String word) { // novo representante
	/*verifica se ele é um novo representante ou se já existe um
	 * */
	
	boolean isRepresentative = false;
	
	//System.out.println(word);
	//System.out.println(palavras);
	List<String> lista = new ArrayList<String>();
	System.out.println(word + "1");
	
	//System.out.println("Get" + );

	Iterator<String> it = lista.iterator();
	
	while(it.hasNext()){
		if(it.equals(word))
			isRepresentative=false;
		
		isRepresentative=true;
	}
	return isRepresentative;
}

}[/code]

Desde já, Valew!!!

Eu ñ entendi qual o seu problema com os getters/setters, eles parecem corretos. Eles ñ funcionam?

PS.: lista de lista - ArrayList<ArrayList>

Então é o seguinte… na hora q eu chamo os setter quer dizer q ele já insere na lista??? ou teria q fazer um método pra inserir numa lista?

Kra a “regra é clara” sempre escreva o código mais simples e curto, a menos q haja um bom motivo p/ faze-lo diverente. Se ñ existe um motivo p/ esse método a mais então faça do seu jeito mesmo.

então… mas eu to aprendendo java… então gostaria q alguém me ajudasse… pq parece q tá escrito ali JAVA BÁSICO… cara num sei… keria uma ajuda por isso estou aki!!! Não fica desfazendo dos outros não!

C alguém poder me ajudar aí galera, preciso mto…

Valew

Ñ sei se vc me entendeu direito mas eu estou tentando ajudar!! Estou sempre ajudando os colegas aqui do GUJ e reconheço a diferença entre um programador experiênte eu um noob, eu já um noob e em muitos assuntos (muitos deles envolvendo java) eu continuo sendo. Então ñ precisa ficar td ofendido. Se eu ñ fui claro o bastante poste outra menssagem q eu tentarei explicar melhor.

Ok então, desculpa…

Vamos lah novamente…
Bom… na hora q chamo o método setter lah… ele já está inserindo em uma lista? ou não???

// Aqui vc ñ está inserindo n lista vc está atribuindo uma nova lista p/ o atributo lista.
public void setPalavras(List<String> palavras) {  
   this.palavras = palavras;  
} 

Espero estar no setter correto:).
P/ vc inserir em um List vc precisa usar o método add(T) da classe list. Mas nesse caso parece q vc está fazendo o corréto. A semântica do método set é de modificar o valor de uma propriedade e ñ de inserir um valor em uma coleção. Então o resultado do seu método setPalavras(List ) é o seguinte:

// se vc tem uma lista:
List<String> l = { "Fear", "of", "the", "dark" };

// e Cluster.palavras for:
public class Cluster {
  private List<String> palavras = { "Dance", "of", "death" };

// e vc chama o método Cluster.setPalavras() passando l como parametro.
// então o valor de palavras fica:
public class Cluster {
  private List<String> l = { "Fear", "of", "the", "dark" };

Pegou ;)!

AAAhhhh… entendi…
Então vou ter q criar algo pra poder ir inserindo mesmo em uma lista???

Tá… lendo tudo novamente… entendi q a parte do set e do getter não insere numa lista ele só troca o valor do objeto!! Essa parte eu entendi…

Agora… a parte do add…
se eu tenho

Cluster clusterDoRadicalDesejado = new Cluster(); List<String> palavrasDoCluster = clusterDoRadicalDesejado.getPalavras(); palavrasDoCluster.add(key2)
onde Cluster é a minha outra classe, o que o add no caso está fazendo?

Ele está adicionando o valor de key2 em palavrasDoCluster. Ou seja:

// se key2 é:
String key2 = "LOL";

// e palavrasDoCluster tem os seguintes valores:
public class Cluster {  
  private List<String> l = { "Fear", "of", "the", "dark" };

// o código q vc citou teria o seguinte resultado:
public class Cluster {  
  private List<String> l = { "Fear", "of", "the", "dark", "LOL" };

Ah certo… entendi di novo…

mas agora to pensanod aki como associar tudo isso ao meu trabalho…

Blz… deixa eu explicar agora o q é pretendido…

Preciso fazer blocos de palavras… tipo assim:
todas as palavras com o memso radical vão ficar na mesma lista…
A primeira posição da lista guarda o radical, as outras as palavras inteira.

se tiver um radical diferente dos que já existem, uma nova lista (ou algo parecido) é inserido com esse radical e a palavra q tem o radical.

Certo?

Será q estou indo no caminho certo? Tem como me dar uma ajuda nessa questão?
Faz tempo que estou empacada nisso e não consigo sair do lugar.

Obrigada pelas ajudas já fornecidas e pelas que ainda virão!!!
:slight_smile:

Ok, eu ñ sei se consegui entender bem quais são as suas duvidas mas, de uma olhada nesse código:

public class Cluster {
  /* Maps guardam pares, nesse caso o primeiro item do par (chama-se chave) será o radical e o segundo (chama-se valor) será a lista de palavras com aquele radical.  */
  Map<String, List<String>> palavras = new HashMap<String, List<String>>();

  /* Esse método adiciona uma palavras às palavras do cluster. */
  public void addPalavra(String palavra) {
    /* aqui vc coloca o código q extrai o radical. */
    if (palavras.containsKey(radical)) {
      palavras.get(radical).add(palavra);
    }
    else {
      List<String> pl = new LinkedList<String>();
      pl.add(palavra);
      palavras.put(radical, pl);
    }
  }

É por ai?

então… só não posso usar hashtable pq c tenho 3 palavras com o mesmo radical, tenho q colocar as 3 com o radical apontando pra elas… com a hashtable eu só consigo em pares certo???

Isso, o HashMap guarda pares. Mas olhe a declaração do HashMap q eu coloquei no exemplo, ela está assim:

Map<String, List<String>> palavras = new HashMap<String, List<String>>();

Nessa declaração eu estou dizendo q o primeiro elemento do par é uma String (o radical) e o segundo é um List (as palavras desse radical). Como segundo é uma lista então vc pode colocar quantas palavras vc quer nessa lista e associa-la à um unico radical.

Squei realmente o q vc colocou ali em cima…
fiz lah no meu prog…
aí apareceu os seguintes erros

[quote]Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at java.util.LinkedList.addBefore(Unknown Source)
at java.util.LinkedList.add(Unknown Source)
at histograma.Cluster2.addPalavra(Cluster2.java:18)
at histograma.Histograma.main(Histograma.java:154)

Squei realmente o q vc colocou ali em cima…
fiz lah no meu prog…
aí apareceu os seguintes erros

[quote]Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at java.util.LinkedList.addBefore(Unknown Source)
at java.util.LinkedList.add(Unknown Source)
at histograma.Cluster2.addPalavra(Cluster2.java:18)
at histograma.Histograma.main(Histograma.java:154)

Posta ai o código da classe Cluster2 e do método main.

SEguinte… fui fuçando fuçando e tentando arrumar… ai deu o seguinte erro:

[quote]Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at java.util.LinkedList.addBefore(Unknown Source)
at java.util.LinkedList.add(Unknown Source)
at histograma.Cluster.addPalavra(Cluster.java:62)
at histograma.Histograma.main(Histograma.java:158)[/quote]

Classe Cluster:

[code]package histograma;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class Cluster {
private String radical;
//private List palavras;
Map<String, List> palavras = new HashMap<String, List>();
private String palavraRepresentante;

public String getPalavraRepresentante() {
	return palavraRepresentante;
}

public void setPalavraRepresentante(String palavraRepresentante) {
	this.palavraRepresentante = palavraRepresentante;
}

public String getRadical() {
	return radical;
}

public void setRadical(String radical) {
	this.radical = radical;
}

public Map<String, List<String>> getPalavras() {
	return palavras;
}

public void setPalavras(Map<String, List<String>> palavras) {
	this.palavras = palavras;
}


public void addPalavra(String palavra) { 
	String radical = null;
    // aqui vc coloca o código q extrai o radical. */  
    if (palavras.containsKey(radical)) {  
      palavras.get(radical).add(palavra);  
    }  
    else {  
      List<String> pl = new LinkedList<String>();  
      pl.add(palavra);  
      palavras.put(radical, pl);  
    }  
  }  

}[/code]

Parte do código q chama o cluster:

[code]while(value2>=lc){ //laço para veer c palavra tem maior ocorrência

    		novoCluster.addPalavra(key2);
    		
    	}  [/code]

Cara… vc é 10… está salvando minha vida!!
heheheheheheehe

Olha eu ñ posso afirmar categóricamente mas eu acho q esse seu while está rodando infinitamente. O erro q vc obteve, java.lang.OutOfMemoryError, diz q o programa extrapolou o limite de memória da JVM. Especificamente aquela parte, Java heap space, indica q vc deve estar usando o operador new dentro de algum loop e assim vc encheu a memória. Posta o restante do código do main p/ ver se eu acho o problema.