Lista de array e localização da subsequência mais longa com o mesmo número [fechado]
-
23-12-2019 - |
Pergunta
Fiquei me perguntando qual seria a melhor maneira de implementar isso.
Não consigo pensar em uma boa maneira de salvar quais informações precisam ser salvas como o índice e o número de valores e, finalmente
public class testing
{
public static void main(String[] args)
{
ArrayList<Integer> numbers = new ArrayList<Integer>();
Scanner in = new Scanner(System.in);
Integer a =0;
Integer value = 0;
Integer num = 0;
boolean loop = true;
//getting the string information
while(loop)
{
System.out.println("Enter a series of numbers, 0 to stop");
Integer n = in.nextInt();
if(n.equals(0))
{
break;
}
else
{
numbers.add(n);
}
}
for (int i = 1; i < numbers.size(); i++)
{
}
}
}
Solução
Você poderia usar um ArrayList 2d, declarado assim:
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
e então declare os 2 ArrayLists para serem adicionados a ele no final do processo:
ArrayList<Integer> length = new ArrayList<Integer>();
ArrayList<Integer> value = new ArrayList<Integer>();
Então
1) percorrer a lista verificando se o elemento é igual ao anterior.
Se for, continue até o final ou seja descoberto um elemento diferente, ponto em que armazene o número dos elementos iguais anteriores no ArrayList chamado 'comprimento' e o valor do elemento naquele chamado 'valor'.Tenha um int (chamado índice, digamos) que armazena o índice do elemento em comprimento contendo o comprimento da subsequência atual mais longa (que será igual ao índice do elemento que contém o valor do elemento do qual é composto (que tem foi armazenado em valor)).
Se não estiver, vá para o próximo elemento.
2) Repita o processo, atualizando o índice se necessário (ou seja,se uma subsequência mais longa for descoberta).
Para adicionar comprimento e valor ao resultado no final, basta fazer result.add(length);
e result.add(value);
Se você quiser retornar um objeto que contenha todas as informações necessárias, você pode agrupar o int 'index' em um Integer e adicioná-lo ao final do ArrayList chamado 'length' ou até mesmo colocá-lo em um novo ArrayList e adicionar esse ArrayList resultar.
Observe que para recuperar um elemento no índice i no primeiro ArrayList (neste caso aquele chamado 'comprimento') depois de ter sido armazenado no resultado, você precisaria fazer
result.get(0).get(i);
EDITAR:
Então a parte do loop for que eu tinha em mente seria esta:
boolean same = false;
int sequenceLength = 0;
Integer sequenceInteger = null;
for (int i = 1; i < numbers.size(); i++)
{
if(numbers.get(i).equals(numbers.get(i-1)))
{
same = true;
sequenceLength++;
}
else(if same == true)
{
sequenceInteger = new Integer(sequenceLength);
//add sequenceInteger to length and numbers.get(i-1) to value
same = false;
sequenceLength = 0;
}
// else do nothing since same is false, which means that the current
// element is different from the previous and the previous is
// different the one before that, so there are no new values to store
}
// end of list reached
(if same == true)
{
sequenceInteger = new Integer(sequenceLength);
//add sequenceInteger to length and numbers.get(i-1) to value
same = false;
}