Jump to content
Roberto Monteiro Dias

Dificuldade em ler dados .txt ao executar o algoritmo Stable Marriage em Java

Recommended Posts

Eu sou novo em Java e estou tentando executar o algoritmo Stable Marrage de GaleShapley, mas ao executá-lo, aparece o  seguinte erro:

 

Error: Index 3 out of bounds for length 3
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 3
    at br.com.entrada.GaleShapley.calcMatches(GaleShapley.java:48)
    at br.com.entrada.GaleShapley.<init>(GaleShapley.java:33)
    at br.com.entrada.GaleShapley1.main(GaleShapley1.java:164)
Gale Shapley Marriage Algorithm

Sized : 3

 

Segue o código abaixo:

 

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class GaleShapley
{
private int N, engagedCount;
private String[][] menPref;
private String[][] womenPref;
private String[] men;
private String[] women;
private String[] womenPartner;
private boolean[] menEngaged;
    /** Constructor **/
    public GaleShapley (){

    }
public GaleShapley(String[] m, String[] w, String[][] mp, String[][] wp)
{
    System.out.println("Sized : "+  mp.length);
    N = mp.length;
    engagedCount = 0;
    men = m;
    women = w;
    menPref = mp;
    womenPref = wp;
    menEngaged = new boolean[N];
    womenPartner =  new String[N];
    calcMatches();
}
/** function to calculate all matches **/
private void calcMatches()
{
    while (engagedCount < N)
    {
        int free;
        for (free = 0; free < N; free++)
            if (!menEngaged[free])
                break;

        for (int i = 0; i < N && !menEngaged[free]; i++)
        {
            int index = womenIndexOf(menPref[free]);
            if (index  < womenPartner.length && womenPartner[index] != null  )
            {
                womenPartner[index] = men[free];
                menEngaged[free] = true;
                engagedCount++;
            }
            else
            {
                String currentPartner = womenPartner[index];
                if (morePreference(currentPartner, men[free], index))
                {
                    womenPartner[index] = men[free];
                    menEngaged[free] = true;
                    menEngaged[menIndexOf(currentPartner)] = false;

                }
            }
        }            
    }
    printCouples();
}
/** function to check if women prefers new partner over old assigned partner **/
private boolean morePreference(String curPartner, String newPartner, int index)
{
    for (int i = 0; i < N; i++)
    {
        if (womenPref[index].equals(newPartner))
            return true;
        if (womenPref[index].equals(curPartner))
            return false;
    }
    return false;
}
/** get men index **/
private int menIndexOf(String str)
{
    for (int i = 0; i < N; i++)
        if (men.equals(str))
            return i;
    return -1;
}
/** get women index **/
private int womenIndexOf(String str)
{
    for (int i = 0; i < N; i++)
        if (women.contains(str))
            return i;
    return -1;
}
/** print couples **/
public void printCouples()
{
    System.out.println("Couples are : ");
    for (int i = 0; i < N; i++)
    {
        System.out.println(womenPartner +" "+ women);
    }
}
/** main function **/
public static void main(String[] args) throws IOException{
    System.out.println("Gale Shapley Marriage Algorithm\n");
    /** list of men **/
    String[] m = {"1", "2", "3"};
    /** list of women **/
    String[] w = {"1", "2", "3"};

    /** men preference **/


    String[][] mp = null ;
    /** women preference **/                      
    String[][] wp= null ;


    try{
      FileInputStream fstream = new FileInputStream("src/input.txt");
      DataInputStream in = new DataInputStream(fstream);
      BufferedReader br = new BufferedReader(new InputStreamReader(in));
      String strLine;
      int line=0;
      int k=0;
      int n=0;
      int i=0;
      while ((strLine = br.readLine()) != null)  {
         
         if(line==0){
            
            n =Integer.valueOf(strLine.trim());
            mp=new String[n][n];
            wp=new String[n][n];
            line++;
         }
         else{

             String[] preferences=strLine.split(" ");

             if(i<n){
                 mp=preferences;
             }
             else{
                 if(i-n < w.length) {
                     wp[i-n]=preferences;

                 }
             }
             i++;
         }
      }
      in.close();

      GaleShapley gs = new GaleShapley(m, w, mp, wp);                        

        }catch (Exception e){//Catch exception if any
            e.printStackTrace();  
            System.err.println("Error: " + e.getMessage());
        }
   }


}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Pavolin9
      Bom dia, estou desenvolvendo um sistema bem simples de estoque onde os itens serao armazenados em uma matriz segue codigo:
          package main;          import java.io.Console;     import java.util.Arrays;     import java.util.Scanner;          public class IncluirItem{         public static void main(String[] args) {             String[][] itens = new String[2][5];             String[] campos = new String[7];             int opcao = 0;             int remover;             int verificar = 0;             int adcionar = 0;             int tamanho = 2;                          Scanner sc = new Scanner(System.in);                          campos [1] = "Nome";             campos [2] = "Codigo de barras";             campos [3] = "quantidade";             campos [4] = "validade";             campos [5] = "data de entrada";                          do {                 System.out.println("\n\n### Sistema de estoque - simplificado ###");                 System.out.println("=========================================");                 System.out.println("      |     1 - Adcionar itens   |");                 System.out.println("      |     2 - Excluir itens    |");                 System.out.println("      |     3 - Mostrar itens    |");                 System.out.println("      |     0 - Sair             |");                 System.out.println("=========================================\n");                                  System.out.println("Escolha uma opcao: ");                 opcao = sc.nextInt();                 System.out.print("\n");                                  switch (opcao) {                 case 1:                     System.out.println("Cadastro de itens: ");                     //Adciona itens                      for (int i = 0; i <2; i++) {                         System.out.println("Adcionar item? ");                         System.out.println("1 para sim \n2 para nao: ");                         adcionar = sc.nextInt();                         if (adcionar == 1) {                             System.out.printf("%d. item \n", (i+1));                             verificar = verificar + 1;                             for (int j=0; j < 5; j++) {                                     System.out.printf("%s ", campos[j+1]);                                 System.out.printf("= ", i,(j+1));                                 itens[i][j] = sc.next();                                                              }                             System.out.printf("\n");                         }                         else {                             break;                         }                     }                                              break;                 case 2:                     //Remove itens                     System.out.println("Exclusao de itens: ");                     if(verificar > 0) {                         for (int i = 0; i <2; i++) {                                 System.out.printf("%d. item \n", (i+1));                             System.out.printf("ID do produto= 00%d \n", (i+1));                             System.out.printf("\n");                         }                     }                     else {                         System.out.println("Nenhum item listado!");                     }                     System.out.println("\nEscolha o numero do item a ser removido: \n");                     remover = sc.nextInt();                     for (int i = 0; i <2; i++) {                         if(remover == 2) {                         itens[i] = itens[i-1];                         }                     }                     break;                 case 3:                     //Mostra itens                     if(verificar > 0) {                                                      for (int i = 0; i <2; i++) {                                     if (verificar == 2) {                                 System.out.printf("%d. item \n", (i+1));                                 System.out.printf("ID do produto= 00%d \n", (i+1));                                 for (int j=0; j < 5; j++) {                                         System.out.printf("%s ", campos[j+1]);                                     System.out.printf("= %s \n", itens [i][j]);                                 }                                 System.out.printf("\n");                             }                             else {                                         itens = Arrays.copyOf(itens, tamanho - 1);                                         verificar = 0;                                         System.out.printf("%d. item \n", (i+1));                                         System.out.printf("ID do produto= 00%d \n", (i+1));                                         for (int j=0; j < 5; j++) {                                                 System.out.printf("%s ", campos[j+1]);                                             System.out.printf("= %s \n", itens [i][j]);                                         }                                         System.out.printf("\n");                                         break;                                 }                         }                     }                     else {                         System.out.println("Nenhum item listado!");                     }                                          break;                 default:                     System.out.println("Opção Inválida!");                     break;                 }             } while(opcao != 0);         }     }  
      Minha duvida é a seguinte, eu quero excluir uma posicao da matriz, exemplo: registrei dois itens, na coluna um e coluna dois da matriz e gostaria de remover a coluna um da lista, como realizo essa função, e outra coisa, eu gostaria de quando eu inserisse pela segunda vez algum item a matriz começasse na proxima possicao vazia, atualmente se eu pedir para inserir um novo item a matriz começa da primeira posicao e assim apaga os elementos ja inseridos.
       
    • By Alisson Hoepers
      Olá pessoal! Para mostrar a lista de um cadastro no meu sistema, eu populo a consulta em um DTO conforme abaixo. Minha pergunta é: Existe uma forma mais simples de popular a consulta na lista do DTO de forma mais simples?
       
      public List<ObjetoDTO> find(Query query) {     @SuppressWarnings("unchecked") List<Object[]> queryResult = query.getResultList(); List<ObjetoDTO> list = new ArrayList<>(); if (queryResult.isEmpty() == false) { for (Object[] item : queryResult) { ObjetoDTO dto = new ObjetoDTO(); dto.setId((Integer) item[0]); dto.setTitulo((String) (item[1])); dto.setDescricao((String) (item[2])); list.add(dto); } } return list; }  
    • By Andréia Bürck
      Gostaria de saber se há como fazer o seguinte, em JAVA ou qualquer outra linguagem: personalizar um áudio. Ou seja, tenho um áudio, e em lugares chaves desse áudio, depois dele pronto, um programa inserir nesses pontos-chave, por exemplo, nomes. Eu falo o nome, e o programa insere nos pontos pré-determinados.
    • By NaPraia
      Beleza pessoal?
       
      seguinte, tenho que desenvolver uma aplicação Java para me comunicar com outro sistema, via Adapter.
      Qual é a melhor forma de fazer isso?
       
      Eu comecei a desenvolver no Eclipse, porém, quando abri o projeto, não coloquei nem com opção de Webservice nem de Maven
       
      E outra dúvida, se instala o Java em servidor? um cara falou isso aqui mas não sei se está zuando.
    • By flipmartinz13
      Alguém pode me ajudar nessa questão de C++? não estou conseguindo construir o algorítmo corretamente.

      5.92)    Faça um algoritmo que leia a matrícula, nome, sexo e três notas dos alunos de uma escola e obtenha os seguintes resultados:
      a) A matrícula da aluna que obteve a maior média.
      b) A matrícula do aluno que obteve a menor média.
      c) O percentual de mulheres na turma.
      d) Quantos alunos foram aprovados, independente do sexo.
      e) O percentual de alunas aprovadas.
      Obs.: o flag é uma matrícula igual a 0 (zero).
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.