Carcleo 4 Denunciar post Postado Outubro 9, 2014 Pessoal, estou precisando de Ajuda com uma Lógica em um exercício da faculdade. O professor (a distancia) pediu o seguinte: Considere que sua empresa seja contratada por uma outra companhia para resolver o problema de projeto de redes a 2-caminhos. Este problema consiste em realizar ligações de vários pares de dispositivos eletrônicos usando OU uma ligação direta OU um outro dispositivo eletrônico entre este par, MINIMIZANDO o custo total destas ligações. Uma maneira de resolver este problema é, a partir de cada par de dispositivos, descobrir qual é a ligação mais barata possível. Neste momento, o custo das ligações que já fazem parte da solução passam a ser zero, indicando que esta ligação pode ser usada para ligar mais de um par de dispositivos. Seu programa deve receber, como parâmetro de entrada, um arquivo contendo as ligações possíveis e os custos associados a essas ligações, e um outro arquivo de entrada indicando os pares que devem ser ligados OBRIGATORIAMENTE. Seu programa deve retornar um arquivo contendo as ligações usadas e o custo da solução. Um EXEMPLO dos arquivos de entrada neste formato seriam //ARQUIVO DE LIGAÇÕES POSSÍVEIS 4 //NÚMERO DE DISPOSITIVOS 1 2 3 //O DISPOSITIVO 1 LIGA-SE AO DISPOSITIVO 2 COM CUSTO 3 1 3 1 1 4 2 2 3 1 2 4 3 3 4 3 //ARQUIVOS DE LIGAÇÕES QUE DEVEM SER FEITAS PELO SEU SOFTWARE 2 //NÚMERO DE LIGAÇÕES OBRIGATÓRIAS 1 2 //SEU SOFTWARE DEVE LIGAR O DIPOSITIVO 1 AO 2 3 4 Logo após a leitura, a solução deve ser calculada e gravada no arquivo resp.txt. Para o exemplo acima, o arquivo de resposta seria composto das ligações {1-3, 2-3, 1-4} com custo 4. Neste caso, a ligação 1-3 foi usada duas vezes. Por questões de desempenho, seu programa deve ler os arquivos de entrada SOMENTE uma vez. Preciso de orientações e desde já agradeço! Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Outubro 10, 2014 A ideia inicial aqui é popular um array de inteiros e dar ele como return de uma função. Mas toda vez que tento fazer função, o compilador pede static void main. import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Scanner; public class LerArquivo3 { public static void main(String[] args) { try { FileReader arq = new FileReader("arquivoPossiveis.txt"); BufferedReader lerArq = new BufferedReader(arq); String linha = lerArq.readLine(); int[6][3] arrayPossiveis; int conta = 0; // lê a primeira linha // a variável "linha" recebe o valor "null" quando o processo // de repetição atingir o final do arquivo texto while (linha != null) { //System.out.printf("%s\n", linha); linha = lerArq.readLine(); for (int i=0; i<linha.length(); i++) { //System.out.print(linha.charAt(i)); arrayPossiveis[conta][0] = Integer.valueOf(linha.charAt(0)); arrayPossiveis[conta][1] = Integer.valueOf(linha.charAt(2)); arrayPossiveis[conta][2] = Integer.valueOf(linha.charAt(4)); } conta++; //System.out.println(); // lê da segunda até a última linha } arq.close(); } catch (IOException e) { System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage()); } System.out.println(); } } Aonde estou errando? Compartilhar este post Link para o post Compartilhar em outros sites
reebr 94 Denunciar post Postado Outubro 10, 2014 Basta usar static no seu método também. Ou então criar uma nova classe com o método nela, assim você pode criar uma instância dentro do main e chamar o método que criou. Posta o código com o método que tentou usar. Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Outubro 11, 2014 Pois é, acho que estou é meio desorientado e preciso estudar mais. Esse ai é o arquivo todo. Apenas troque o static void por um método que retorna String Erro: C:\java\ad2>javac LerArquivo4.java LerArquivo4.java:44: error: incompatible types: int[][] cannot be converted to S tring[] return arrayPossiveis; ^ 1 error C:\java\ad2> Compartilhar este post Link para o post Compartilhar em outros sites
reebr 94 Denunciar post Postado Outubro 11, 2014 O problema não é o static. Acontece que você está tentando retornar um array bidimensional de um método que deve retornar uma String. Em qual parte do seu código você retornou? Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Outubro 11, 2014 Entendi.Agora esta assim:Criei 5 arquivos:arquivoPossiveis.txt // com os numeros possiveisarquivoObrigatorios.txt // com os numeros ObrigatoriosLerArquivoPossivel.java retornando um array multidimensional de int[6][3]LerArquivoObrigatorio.java retornando um array multidimensional de int[2][2]Principal.java. Com a saída principalUma coisa queria ver contigo: Deve ter uma forma de popular os dois arquivos ao mesmo tempo em java e ter um array multidimensional dinâmica.arquivoPossiveis.txt // com os numeros possiveis 1 2 3 1 3 1 1 4 2 2 3 1 2 4 3 3 4 3arquivoObrigatorios.txt // com os numeros Obrigatorios1 2 3 4LerArquivoPossivel.java retornando um array multidimensional de int[6][3]import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class LerArquivoPossivel { public static void main (String[] args) { } int [][] getArray (String arquivo) { return constroiArrayPossivel(arquivo); } int [][] constroiArrayPossivel(String arquivo) { int [][] arrayImPossiveis = new int [0][0]; try{ FileReader arq = new FileReader(arquivo); BufferedReader lerArq = new BufferedReader(arq); String linha = lerArq.readLine(); int[][] arrayPossiveis = new int[6][3]; int conta = 0; // lê a primeira linha // a variável "linha" recebe o valor "null" quando o processo // de repetição atingir o final do arquivo texto while (linha != null) { for (int i=0; i<linha.length(); i++) { arrayPossiveis[conta][0] = Character.getNumericValue(linha.charAt(0)); arrayPossiveis[conta][1] = Character.getNumericValue(linha.charAt(2)); arrayPossiveis[conta][2] = Character.getNumericValue(linha.charAt(4)); } conta++; linha = lerArq.readLine(); // lê da segunda até a última linha } arq.close(); return arrayPossiveis; } catch (IOException e) { System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage()); return arrayImPossiveis; } } }LerArquivoObrigatorio.java retornando um array multidimensional de int[2][2]import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class LerArquivoObrigatorio { public static void main (String[] args) { } int [][] getArray (String arquivo) { return constroiArrayObrigatorio(arquivo); } int [][] constroiArrayObrigatorio(String arquivo) { int [][] arrayImObrigatorios = new int [0][0]; try{ FileReader arq = new FileReader(arquivo); BufferedReader lerArq = new BufferedReader(arq); String linha = lerArq.readLine(); int[][] arrayObrigatorios = new int[2][2]; int conta = 0; // lê a primeira linha // a variável "linha" recebe o valor "null" quando o processo // de repetição atingir o final do arquivo texto while (linha != null) { for (int i=0; i<linha.length(); i++) { arrayObrigatorios[conta][0] = Character.getNumericValue(linha.charAt(0)); arrayObrigatorios[conta][1] = Character.getNumericValue(linha.charAt(2)); } conta++; linha = lerArq.readLine(); // lê da segunda até a última linha } arq.close(); return arrayObrigatorios; } catch (IOException e) { System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage()); return arrayImObrigatorios; } } }Principal.java. Com a saída principalpublic class Principal { public static void main (String[] args) { LerArquivoPossivel arquivoPossiveis = new LerArquivoPossivel(); int[][] arrayPossiveis = new int[6][3]; arrayPossiveis = arquivoPossiveis.getArray("arquivoPossiveis.txt"); LerArquivoObrigatorio arquivoObrigatorios = new LerArquivoObrigatorio(); int[][] arrayObrigatorios = new int[2][2]; arrayObrigatorios = arquivoObrigatorios.getArray("arquivoObrigatorios.txt"); } } Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Outubro 11, 2014 Reduzindo o tamanho da dúvida: import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class Principal { public static void main (String[] args) { String arquivo = "arquivoPossiveis.txt"; FileReader arq = new FileReader(arquivo); ....... Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Outubro 11, 2014 Ok. Por último. Porque é que na linh 63 não imprime nada. Compilador não dá erro e roda normalmente? import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class Principal { public static void main (String[] args) { try{ String arquivo = "arquivoPossiveis.txt"; FileReader arq = new FileReader(arquivo); BufferedReader lerArq = new BufferedReader(arq); String linha = lerArq.readLine(); int contaLinha = 0; int contaColuna = 0; int conta = 0; // lê a primeira linha // a variável "linha" recebe o valor "null" quando o processo // de repetição atingir o final do arquivo texto while (linha != null) { contaColuna = 0; for (int i=0; i<linha.length(); i++) { contaColuna++; } contaLinha++; linha = lerArq.readLine(); // lê da segunda até a última linha } ArrayList<Ligacoes> LigacaoObrigatoria = new ArrayList<Ligacoes>(); ArrayList<Ligacoes> LigacaoPossivel = new ArrayList<Ligacoes>(); int[][] arrayRetorno = new int[contaLinha][contaColuna]; while (linha != null) { for (int i=0; i<linha.length(); i++) { if(contaColuna==3) { int pontoA = Character.getNumericValue(linha.charAt(0)); int pontoB = Character.getNumericValue(linha.charAt(2)); LigacaoObrigatoria.add(new Ligacoes(pontoA,pontoB)); } if(contaColuna==5) { int pontoA = Character.getNumericValue(linha.charAt(0)); int pontoB = Character.getNumericValue(linha.charAt(2)); int distancia = Character.getNumericValue(linha.charAt(4)); LigacaoPossivel.add(new Ligacoes(pontoA,pontoB)); new Ligacoes(pontoA,pontoB).informaDistancia(distancia); } } conta++; linha = lerArq.readLine(); // lê da segunda até a última linha } arq.close(); for (int i = 0; i < LigacaoObrigatoria.size(); i++) { int s = LigacaoObrigatoria.get(i).getPontoA(); System.out.println(s); } } catch (IOException e) { System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage()); } } } Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Outubro 11, 2014 Vou postar as 3 classesDistancias.java public class Distancias extends Ligacoes { private int distancia; Distancias(int a, int b) { super (a,b); } public void setDistancia(int c) { this.distancia = c; } public int getDistancia () { return this.distancia; } }Ligacoes.javapublic class Ligacoes { private int pA, pB; private Distancias distancia; Ligacoes (int a, int b) { this.pA = a; this.pB = a; } public void informaDistancia (int _distancia) { distancia = new Distancias (this.pA, this.pB); distancia.setDistancia(_distancia); //System.out.println(distancia.getDistancia()); } public int getPontoA () { return this.pA; } public int getPontoB () { return this.pB; } public int getDistanciaAB () { return this.distancia.getDistancia(); } }Principal.javaimport java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class Principal { public static void main (String[] args) { try{ String arquivo = "arquivoPossiveis.txt"; FileReader arq = new FileReader(arquivo); BufferedReader lerArq = new BufferedReader(arq); String linha = lerArq.readLine(); ArrayList<Ligacoes> LigacaoObrigatoria = new ArrayList<Ligacoes>(); ArrayList<Ligacoes> LigacaoPossivel = new ArrayList<Ligacoes>(); boolean possivel; // lê a primeira linha // a variável "linha" recebe o valor "null" quando o processo de repetição atingir o final do arquivo texto int pontoA, pontoB, distancia, contaColuna; while (linha != null) { contaColuna = linha.length(); pontoA = Character.getNumericValue(linha.charAt(0)); pontoB = Character.getNumericValue(linha.charAt(2)); if(contaColuna>=5) { distancia = Character.getNumericValue(linha.charAt(4)); LigacaoPossivel.add(new Ligacoes(pontoA,pontoB)); new Ligacoes(pontoA,pontoB).informaDistancia(distancia); } else { LigacaoObrigatoria.add(new Ligacoes(pontoA,pontoB)); } linha = lerArq.readLine(); // lê da segunda até a última linha } arq.close(); for (int i = 0; i < LigacaoPossivel.size(); i++) { int s = LigacaoPossivel.get(i).getDistanciaAB(); System.out.println(s); } } catch (IOException e) { System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage()); } } }Compila normal.Mas dá erro de execução:C:\java\2>java Principal Exception in thread "main" java.lang.NullPointerException at Ligacoes.getDistanciaAB(Ligacoes.java:31) at Principal.main(Principal.java:50) C:\java\2> Ou seja: Como faço para, à partir da classe Principal, pegar o valor da variável distancia que esta na classe Distancias que estende a classe Ligações? Compartilhar este post Link para o post Compartilhar em outros sites
Hercles 0 Denunciar post Postado Outubro 13, 2014 você esta a criar matriz 6 por 3 e 2 por 2 para os arquivos Possiveis e Obrigatório ? Já pensou em outra solução com ponteiros ? Se o arquivo tiver que ser alterado passar pra 3 por 7 ou 2 por 3 por exemplo... Compartilhar este post Link para o post Compartilhar em outros sites