Olá pessoal
Eu tenho 4 variaveis, onde cada uma dessas variaveis dependendo do valor passaria para uma Scene diferente. O problema é que eu não sei como fazer para que ele não considere a ordem e sim a variavel de maior quantidade.
Por exemplo,
var1 = 5
var2 = 3
var3 = 7
var4 = 4
Ele vai para a tela da var1 e var2 no lugar de ir para a tela da var1 e var3.
public void Comparacao()
{
if (botr > 2)
{
if (laque < 4)
{
if (crot < 4)
{
if (elap < 4)
{
Debug.Log("botr");
Botropico();
}
else { Debug.Log("botr e elap"); ElapBotr(); }
}
else { Debug.Log("botr e crot"); CrotBotr(); }
}
else { Debug.Log("botr e laque"); LaqueBotr(); }
}
else
{
if (laque > 2)
{
if (botr < 4)
{
if (crot < 4)
{
if (elap < 4)
{
Debug.Log("laque");
Laquetico();
}
else { Debug.Log("laque e elap"); ElapLaque(); }
}
else { Debug.Log("laque e crot"); CrotLaque(); }
}
else { Debug.Log("laque e botr"); LaqueBotr(); }
}
else
{
if (crot > 2)
{
if (botr < 4)
{
if (laque < 4)
{
if (elap < 4)
{
Debug.Log("crot");
Crotalico();
}
else { Debug.Log("crot e elap"); ElapCrot(); }
}
else { Debug.Log("crot e laque"); CrotLaque(); }
}
else { Debug.Log("crot e botr"); CrotBotr(); }
}
else
{
if (elap > 2)
{
if (botr < 4)
{
if (laque < 4)
{
if (crot < 4)
{
Debug.Log("elap");
Elapidico();
}
else { Debug.Log("elap e crot"); ElapCrot(); }
}
else { Debug.Log("elap e laque"); ElapLaque(); }
}
else { Debug.Log("elap e botr"); ElapBotr(); }
}
else { Erro(); }
}
}
}
}
Use [emphasys]Arrays[/emphasys] e [emphasys]Linq[/emphasys].
using System;
using System.Linq;
public class Test
{
public static void Main()
{
var values = new int[] { 7, 8, 15, 3, 18 };
var result = values.Max(); // 18
}
}
Como eu faria pra pegar o segundo maior valor e fazer uma condição usando as duas?
Tem algo de muito estranho aí. Deixa eu ver se entendi direito... dessas 4 variáveis você sempre quer as duas com maior valor para ir para uma cena específica.
Isso significa que existem 6 combinações de duas dessas 4 variáveis. Então são um total de 6 telas possíveis também?
:math:
A maneira mais confiável e simples nesse caso seria [emphasys]Array.Sort(array)[/emphasys] e [emphasys]Array.Reverse(array)[/emphasys].
using System;
class MainClass {
public static void Main (string[] args) {
int[] items = { 5, 7, 28, 2, 1, 34 };
Array.Sort(items);
Array.Reverse(items);
var item1 = items[0];
var item2 = items[1];
}
}
No entanto o uso constante disso pode causar um certo impacto no desempenho, então recomendo evitar.
Shiro: De qualquer forma, usar números desorganizados a menos que você receba-os de outra fonte geralmente né boa prática ¯\_(ツ)_/¯
Meu ponto não é esse, Sotelie. Independente de você obter os dois maiores valores de um array o que você realmente quer nesse caso são os índices de onde estes dois valores estão porque são eles que vão importar na hora de escrever a comparação.
Mesmo assim, como não tenho um vislumbre total do problema é inútil para mim matematizar (que normalmente é o que faria pra obter todas as saídas independente do número de entradas em uma única condição com saída única). )o)
Fazer isso não vai fazer eu perder qual array é qual?
Veja bem, coloquei para cada array ser referente a um tipo.
Array[0]//botropico
Array[1]//laquetico
Array[2]//crotalico
Array[3]//elapidico
O que eu quero fazer é que por exemplo eu pegue as duas arrays de maior valor ex, Array[1] e Array[3] e eu vá para uma scene especifica dessa array, nesse caso chamando o ElapBotr();. Do modo que você colocou parece que misturaria as arrays e eu perderia a referencia de qual array é de quê, serio, eu não posso misturar, cada array dessa é especifico de uma coisa.
É como o Shiro falou.
Você não precisa perder a array original se fizer uma cópia, nesse caso eu usaria listas ao invés de arrays :batrick:
var items = new int[] { 1, 5, 10 };
var copy = new List<int>(items);
Listas possuem vários métodos pra se achar o Index de alguma coisa.
copy.IndexOf(15); // Retorna o index do primeiro elemento que for 15.
Mas xô ver se entendi, tu quer:
1 - Checar qual array é a maior (em questão de número de elementos)
2 - Checar qual array é a maior (qual array tem o maior número)
3 - Checar qual array é a maior (qual array tem a maior soma de números)
:batrick:
Eu quero o 2, e comparar duas arrays se tiver mais de uma com um valor alto, chamar uma scene especifica das arrays selecionadas.
Exemplo, se a array de crotalico tiver o maior valor, chamo a scene da tela de crotalico, mas se tiver a array de crotalico e a de laquetico com os maiores valores, vou chamar uma scene de crotalico & laquetico, mas pra isso eu preciso separar as arrays de valores altos, e saber como vou criar uma condição usando elas.
Se tiver complicado de entender, eu explico o que eu to fazendo melhor. >.<
Acho que entendi. Xô fazer uns experimentos aqui e daqui a pouco retorno \o/
Bom, pelo que eu entendi, você quer definir os maiores valores de 2 variáveis dentre 4 variáveis possíveis, certo? Se for isso, acredito que não precisa de um array, é algo um pouco mais simples, de qualquer forma, eu fiz um aqui, veja se é isso que estava querendo.
private int var1,var2,var3,var4;
void Start()
{
//Defina aqui os valores de cada variável
var1 = 5;
var2 = 3;
var3 = 7;
var4 = 4;
Comparacao();
}
void Update()
{
}
void Comparacao()
{
if (var1 > var2)
{
if (var1 > var3)
{
if (var1 > var4)
{
print(var1);
//Obteve aqui o número maior na variável 1
if( var2 > var3 && var2 > var4)
{
print(var2);
//Obteve aqui o segundo maior na variável 2
}
else if (var3 > var2 && var3 > var4)
{
print(var3);
//Obteve aqui o segundo maior na variável 3
}
else if (var4 > var2 && var4 > var3)
{
print(var4);
//Obteve aqui o segundo maior na variável 4
}
}
}
}
if (var2 > var1)
{
if (var2 > var3)
{
if (var2 > var4)
{
print(var2);
//Obteve aqui o número maior na variável 2
if (var1 > var3 && var1 > var4)
{
print(var1);
//Obteve aqui o segundo maior na variável 1
}
else if (var3 > var1 && var3 > var4)
{
print(var3);
//Obteve aqui o segundo maior na variável 3
}
else if (var4 > var1 && var4 > var3)
{
print(var4);
//Obteve aqui o segundo maior na variável 4
}
}
}
}
if (var3 > var1)
{
if (var3 > var2)
{
if (var3 > var4)
{
print(var3);
//Obteve aqui o número maior na variável 3
if (var1 > var2 && var1 > var4)
{
print(var1);
//Obteve aqui o segundo maior na variável 1
}
else if (var2 > var1 && var2 > var4)
{
print(var2);
//Obteve aqui o segundo maior na variável 2
}
else if (var4 > var1 && var4 > var2)
{
print(var4);
//Obteve aqui o segundo maior na variável 4
}
}
}
}
if (var4 > var1)
{
if (var4 > var2)
{
if (var4 > var3)
{
print(var4);
//Obteve aqui o número maior na variável 4
if (var1 > var2 && var1 > var3)
{
print(var1);
//Obteve aqui o segundo maior na variável 1
}
else if (var2 > var1 && var2 > var3)
{
print(var2);
//Obteve aqui o segundo maior na variável 2
}
else if (var3 > var1 && var3 > var2)
{
print(var3);
//Obteve aqui o segundo maior na variável 3
}
}
}
}
}
Você não explicou como você vai obter as variáveis, portanto, deixei eles no começo do script pré-definido, como no seu exemplo, de qualquer forma é fácil defini-los como queira, espero que seja isso que estava precisando!
Vou testar e dou um edit falando se funcionou ou não.
Resultados dos meus experimentos.
Eu queria fazer com que você não se limitasse a um número específico de arrays, sendo assim usei listas, fica bem intuitivo por vezes.
using System.Linq;
using System;
using System.Collections.Generic;
// Lista de lista de números.
List<List<int>> variables = new List<List<int>>
{
new List<int> { 12, 20, 1020, 102 },
new List<int> { 12, 20, 36, 102 },
new List<int> { 27, 603, 12, 188 },
new List<int> { 108, 17, 103, 708 }
};
// Lista com os maiores números de cada lista.
// [Maior Número, Index do Maior Número, Número da Lista Em Que Este Número Está Contido.]
List<int[]> biggestNums = new List<int[]>();
// Preenchendo as listas.
int id;
for (int i = 0; i < variables.Count; i++)
{
id = variables[i].Max();
biggestNums.Add(new int[] { id, variables[i].IndexOf(id), i });
}
List<int[]> ordered = new List<int[]>(biggestNums);
// Uma lista ordenada com os maiores números em ordem crescente, e seus indexes nas listas originais.
List<int[]> orderedList = ordered.OrderBy(num => num[0]).ToList();
// O maior número (com o index) sempre será o último da lista.
// Para checar se existe duas listas com o mesmo maior número, basta ver em ordem decrescente os números repetidos.
foreach(int[] i in orderedList)
{
#if UNITY_EDITOR
Debug.Log(string.Format("[{0},{1},{2}]", i[0], i[1], i[2]);
#else
Console.WriteLine("[{0},{1},{2}]", i[0], i[1], i[2]);
#endif
}
// Pequeno exemplo pra testar.
for (int i = orderedList.Count - 1; i > 0; i--)
{
if (orderedList[i][0] == orderedList[orderedList.Count - 1][0])
{
// O maior número é o mesmo número que o maior na lista.
}
#if UNITY_EDITOR
Debug.Log(string.Format("[{0},{1},{2}]", orderedList[i][0], orderedList[i][1], orderedList[i][2]));
#else
Console.WriteLine("[{0},{1},{2}]", orderedList[i][0], orderedList[i][1], orderedList[i][2]);
#endif
// Só para lembrar:
// [ O maior número, o index do número na lista, a lista em que ele se encontra]
}
Você pode inserir quantas listas quiser no [emphasys]variables[/emphasys] (primeira lista ali), e quantos números quiser nela.
Os resultados se encontram em [emphasys]orderedList[/emphasys], que é uma lista de arrays em ordem crescente de 3 elementos: [maior número da array, index do número na array, a qual array ele pertence]
Eu queria ter deixado mais simples, mas tô numa situação complicada pra digitar então é tudo o que eu pude fazer ;-;
O código do Lycanimus funcionou exatamente como eu queria. Valeu também Sotelie, eu preferi o codigo do Lycanimus porque eu entendi melhor, mas agradeço MUITO a atenção que cê teve.