ConcurrentException SEM USAR ITERATOR

7 respostas
V

Antes de tudo peço desculpas por postar esse tópico tanto na parte de java avançado como na de básico, aparentemente o pessoal lá não tá conseguindo achar uma solução.

Estou tendo concurrentException sem usar Iterator. Não há sequer a existencia de nenhum iterator no código inteiro e em classe alguma. Também não há nenhuma thread a não ser a principal.

public void replicarMenorClasse(){
		replicar(classe1Treinamento,classe2Treinamento); //chamada 1
		replicar(classe1Validacao,classe2Validacao); //chamada 2
		
	}
	
	public void replicar(List l1, List l2){
		int sizeMax = l1.size();
		int sizeMin = l2.size();  // erro ocorre nessa linha na chamada 2
		
		int dif = sizeMax - sizeMin;
		
		for(int i=0;i<=dif-1;i++){
			l2.add(l2.get(i));
		}
	}

Edit1:

Algo que pode ajudar voces, se eu trocar a ordem da chamada do replicar ,ou seja se ficar assim, O erro passa a ser na chamada 1, e a linha real do erro continua a mesma:
public void replicarMenorClasse(){
                replicar(classe1Validacao,classe2Validacao);  //chamada 2
                replicar(classe1Treinamento,classe2Treinamento); //chamada 1
		
		
	}
Já tentei resolver com "Thread.sleep(x)" entre os 2 replicar mas nao fez nada Valeu a ajuda, é a segunda vez q tenho esse problema, a primeira fiz uma gambiarra nojenta agora resolvi pedir ajuda, vlw

Edit2: Affz...acabei de achar outro erro desses no código (comentei o replicar só pra ver se o resto rodaria)....

treinamento = new ArrayList<String>();
		treinamento.addAll(this.classe1Treinamento);
		treinamento.addAll(this.classe2Treinamento); // erro ocorre nessa linha

Eu ate gostava das Collections do java, mas agora já vou pensar 3 vezes antes de usar, é o famoso barato que sai caro

7 Respostas

maxguzenski

hm … deve ser pq voce chupo bala aqui “l2.add(l2.get(i));”

pegar e inserir no mesmo … tem certeza q eh isso?

[editado]
O que voce quer fazer nesse codigo? vejamos se a lista 1 tem 10 elementos e a 2 tem 7 … tu simplesmente pega os 3 primeiros (qualquer q sejam os objetos) da lista 1 e coloca na 2???

V

A lógica do código está correta, veja a explicação:
Tem a Lista1 e a Lista2, o objetivo é repetir os objetos da Lista2 nela mesma, quantas vezes for necessário, até que o tamanho dela seja igual ao tamanho da Lista1.

Só pra reforçar, Os elementos que vao ser inseridos na Lista2 são elementos já estão presentes nela.

Valeu a atenção

maxguzenski

hm, extranho mas tudo bem…

tira o for e tenta assim:

l2.addAll( l2.subList(0, dif - 1) );

V

Testei assim e não funcionou, deu exatamente o mesmo erro.

E também, infelizmente se eu usar essa abordagem, para o caso da Lista1 ser muito maior que a Lista2, não terei o resultado desejado.

Ex:
Lista1.size() = 40000 ; Lista2.size() = 700
Esse código me retornaria uma Lista2 com tamanho no máximo de 1400 (consideranado que não levantaria nenhuma exceção do subList ).

O estranho é que o erro ocorre no momento da leitura, invés de ser o da escrita.

Segue uma listinha do que já tentei fazer e não funcionou:

[list]Inserir o modificador “synchronized” nos métodos involvidos[/list]
[list]Criar as listas com “Collections.synchronized”[/list]
[list]Usar Thread.sleep(long) entre as chamadas do “replicar”[/list]

maxguzenski

Cara,
1º - Programo a 10 anos em java e nunca vi essa tua necessidade… se voce simplesmente quer 2 listas do mesmo tamanho eh so clonar a primeira, ou se os valores que estao na lista 2 importa alguma coisa eh so copiar da primeira o restante.

2º - Fiz um teste com seu codigo e funciona sem erro aqui, acredito que voce esta com uma jre que nao seja da SUN ou a instancia da List q voce esta passando nao eh um ArrayList e sim outra implementacao bugada de terceiros.

V

1º: Provavelmente você nunca trabalhou com inteligência artificial, é daí que vem a necessidade, se quiser um explicação aprofundada eu dou.

2º: São todas ArrayList, segue momento de incialização:

classe1Treinamento = new ArrayList<String>();
		classe1Validacao = new ArrayList<String>();
		
		
		classe2Treinamento = new ArrayList<String>();
		classe2Validacao = new ArrayList<String>();

A versão do jre é 1.6.0_07, e baixei direto do site da Sun

Sobre você ter conseguido rodar, fiz o teste agora e sem esse pedaço do meu código: , eu consegui rodar

classe1Treinamento = classe1.subList(0, classe1.size()/2);
		classe1Validacao = classe1.subList(classe1.size()/2, (classe1.size()*3)/4);
		
		
		
		classe2Treinamento = classe2.subList(0, classe2.size()/2);
		classe2Validacao = classe2.subList(classe2.size()/2, (classe2.size()*3)/4);
maxguzenski

cara, baseado no teu primeiro codigo eu fiz assim:

public class Teste {

	public static void replica(List l1, List l2) {
		int dif = l1.size() - l2.size();
			
		l2.addAll( l2.subList(0, dif-1) );
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<String> l1 = new ArrayList<String>(Collections.nCopies(10, "s"));
		List<String> l2 = new ArrayList<String>(Collections.nCopies(8, "s"));
		
		replica(l1, l2);
	}
}

rodou sem erros na versao:

java version “1.5.0_16”
Java™ 2 Runtime Environment, Standard Edition (build 1.5.0_
Java HotSpot™ Client VM (build 1.5.0_16-b02, mixed mode)

Windwos XP x32

Criado 16 de outubro de 2008
Ultima resposta 16 de out. de 2008
Respostas 7
Participantes 2