if(lado1 == lado2 || lado1 == lado3 || lado2 == lado3)
A instrução acima é provida de um curto circuito (não necessita validar tudo).
O if -> else if, também se comporta como um short circuit, pois a primeira proposição que for verdadeira encerra as demais estruturas condicionais sem as testar.
Como o primeiro if valida se é equilátero e encerra o fluxo, sobra o teste para isóceles e escaleno.
Então a validação do isóceles depende da do equilátero, a lógica possui dependência.
Se não for equilátero, nem isóceles, sobra apenas o escaleno.
O maior problema que vejo, é a necessidade de verificar a condição de existência do triângulo, conforme feito a seguir:
Ressalva, o código deve filtrar valores menores ou iguais a 0, pois os lados do triângulo devem ser positivos.
Obs.: o curto circuito também ocorre com o operador &&.
Não cheguei a fazer muitos testes, mas outra forma de verificação vai ai:
package teste;
import java.util.Arrays;
import java.util.stream.DoubleStream;
public class Triangulo {
private final double[] lados;
public Triangulo(double ladoA, double ladoB, double ladoC) {
lados = new double[]{ladoA, ladoB, ladoC};
}
private static double maiorLado(double... lados) {
return DoubleStream.of(lados).max().orElse(0);
}
public double maiorLado() {
return maiorLado(lados);
}
public double somaLados() {
return somaLados(lados);
}
private static double somaLados(double... lados) {
return DoubleStream.of(lados).sum();
}
public static boolean isTrianguloPossivel(double ladoA, double ladoB, double ladoC) {
if (Arrays.asList(ladoA, ladoB, ladoC).stream().anyMatch(lado -> lado <= 0)) {
return false;
}
double maiorLado = maiorLado(ladoA, ladoB, ladoC);
return maiorLado < somaLados(ladoA, ladoB, ladoC) - maiorLado;
}
public TipoTriangulo getTipoTriangulo() {
int totalMedidas = (int) DoubleStream.of(lados).distinct().count();
return Arrays.stream(TipoTriangulo.values())
.filter(tipo -> tipo.totalMedidas == totalMedidas)
.findFirst().get();
}
public double[] getLados() {
return lados;
}
}
.
package teste;
/*Avaliei pelas medidas iguais e não pela quantidade de lados iguais,
Ex.: equilatero tem uma medida para todos os lados*/
public enum TipoTriangulo {
EQUILATERO(1), ISOCELES(2), ESCALENO(3),;
int totalMedidas;
private TipoTriangulo(int totalMedidas) {
this.totalMedidas = totalMedidas;
}
}
.
package teste;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Efemera {
public static void main(String[] args) {
int[][] matrizTeste = {
{5, 5, 5},
{5, 6, 5},
{3, 7, 2},
{5, 4, 11},
{0, 1, 2},
{-3, 4, 5},
{8, 6, 13}
};
List<Triangulo> triangulos = new ArrayList<>();
List<String> descartado = new ArrayList<>();
Arrays.stream(matrizTeste).forEach(lado -> {
if (Triangulo.isTrianguloPossivel(lado[0], lado[1], lado[2])) {
triangulos.add(new Triangulo(lado[0], lado[1], lado[2]));
} else {
descartado.add("Não é possivel formar um triângulo: " + Arrays.toString(lado));
}
});
triangulos.forEach(triangulo ->
System.out.println(Arrays.toString(triangulo.getLados()) + triangulo.getTipoTriangulo())
);
descartado.forEach(System.out::println);
}
}
Me lembrou a 3ª ou 4ª série, quando a professora falou sobre a condição de existência dos triângulos.