[JAVA] Tablice wielowymiarowe

0

Witam, otóż napisałem program, który wczytuje dane z pliku do tablicy dwuwymiarowej, a następnie przeszukuje (binarysearch)tę tablicę. Program działa, ale do zrobienia go, musiałem użyć 3 tablic z prawie tą sama zawartością - ponieważ binarysearch przyjmuje tylko tablice jednowymiarowe, mogę wpisać np tablica[1][], wtedy łyknie drugą kolumnę do przeszukiwania. Ale jak zmusić, żeby program przeszukał 1 pierwszą kolumnę? niestety java nie łyka czegoś takiego jak tablica[][1]. Poza tym do wyszukiwania potrzebuje również połączone rekordy dwóch kolumn. Czy istnieje jakiś sposób, aby załatwić to jednąt ablicą? Załączam fragmenty kodu:

public testujM() throws Exception
    {
        int lineCount = 0;
        BufferedReader rdr = new BufferedReader(new InputStreamReader(new FileInputStream(Plik_Zrodlowy),
        Kodowanie));
        while ((rdr.readLine()) != null)
        {
            lineCount++;
        }

        String wers;
        dane = new String[lineCount][4];
        daneRozszerzone = new String[lineCount];
        TablicaKodow = new String[lineCount];
        lineCount=0;
        BufferedReader rdr2 = new BufferedReader(new InputStreamReader(new FileInputStream(Plik_Zrodlowy),
        Kodowanie));
        while ((wers=rdr2.readLine()) != null)
        {
            dane[lineCount]=wers.split(";");
            TablicaKodow[lineCount] = dane[lineCount][0];
            daneRozszerzone[lineCount]= ((dane[lineCount][0]+dane[lineCount][1]).toLowerCase());
            lineCount++;
        }

    }

static private boolean SprawdzKod(String kod) throws Exception
    {
        if(0>(numer_wersu=Arrays.binarySearch(TablicaKodow, kod)))         
            return true;
        else

            return false;
    }

    static private boolean SprawdzKodPonownie(String kod, String miasto)
    {
        if(0>(numer_wersu=Arrays.binarySearch(daneRozszerzone, ((kod+miasto).toLowerCase()))))        
            return true;
        else
            return false;
    }

    static private boolean SprawdzMiasto(String miasto)
    {
       if(0==dane[numer_wersu][1].compareToIgnoreCase(miasto))
            return true;
        else
            return false;
    }

0

Niezupelnie jest dla mnie jasne, jakiego typu elementy przegladasz (para: kod + miasto?). Zastanawiales sie, czy uzycie java.util.TreeMap nie byloby wlasciwszym rozwiazaniem? Z kolei zrodla, ktory wkleiles sugeruja, ze rozne miasta moga miec taki sam kod. Inaczej wyszukiwanie pary "kod+miasto" nie mialoby sensu. Mozesz przedstawic przykladowe dane?

BTW: w bardzo nieefektowyn sposob przegladasz dwa razy ten sam plik, pomijajac fakt, ze nigdzie go nie zamykasz (BufferedReader.close()).

0

tu jest kawałek pliku źródłowego:

00-002;Warszawa;tak;tak
00-003;Warszawa;tak;tak
20-437;Lublin;tak;tak
20-439;Lublin;tak;tak
20-440;Lublin;tak;tak

Tak, możliwe jest, ze pod jednym kodem może być parę miast.

0
  1. zamiast tego:
BufferedReader rdr = new BufferedReader(new InputStreamReader(new FileInputStream(Plik_Zrodlowy), Kodowanie));
        while ((rdr.readLine()) != null)
        {
            lineCount++;
        }

możesz użyć LineNumberReader

  1. co do wyszukiwania binarySearch najpierw tablica musi być posortowana a tego tu nie widzę

  2. możesz użyć binarySearch z własnym Comparator wtedy nie musisz używać 3 tablic wystarczy jedna + odpowiednie Comparatory

0

Dzięki za wskazówki, zrobiłem comparatory, i dodałem sortowanie. Zmieniłem BufferedReader na LineNumberReader, co sprawiło, ze kod jest bardziej przejrzysty, ale nadal jest problem podwójnego odczytywanie tego samego pliku - a nie mogę sklonować, bo BufferedReader ma metode protected clone().

public testujM(String Plik_Zrodlowy) throws Exception
    {
        try
        {
            rdr = new LineNumberReader(new InputStreamReader(new FileInputStream(Plik_Zrodlowy),
            Kodowanie));
        }
        catch(FileNotFoundException e)
        {
            System.out.println("Plik z kodami pocztowymi nie znaleziony: "+e.getMessage());
            System.exit(1);
        }

        while ((rdr.readLine()) != null);
        dane = new String[rdr.getLineNumber()][4];       
        String wers;
        rdr.close();
        LineNumberReader rdr2 = new LineNumberReader(new InputStreamReader(new FileInputStream(Plik_Zrodlowy),
        Kodowanie));
        while ((wers=rdr2.readLine()) != null)
            dane[rdr2.getLineNumber()-1]=wers.split(";");
        Arrays.sort(dane, new ArrayColumnComparator(0));
        rdr2.close();
    }
0

Pierwsze czytanie robisz po to by policzyć wiersze i ustalić rozmiar tablicy. Zrezygnuj z tablicy i użyj kolekcji.

public void testujM(String Plik_Zrodlowy)  throws Exception
    {

        ArrayList dane = new ArrayList();       
        String wers;
	try
	{
            LineNumberReader rdr2 = new LineNumberReader(new InputStreamReader(new FileInputStream(Plik_Zrodlowy),Kodowanie));
            while ((wers=rdr2.readLine()) != null)
                dane.add(wers.split(";"));
	    rdr2.close();
	}
        catch(FileNotFoundException e)
        {
            System.out.println("Plik z kodami pocztowymi nie znaleziony: "+e.getMessage());
            System.exit(1);
        }		
        Collections.sort(dane, new ArrayColumnComparator(0));
    }
}
0

Niestety nie mogę użyć kolekcji ze względu na binarySearch().

0

W kolekcjach tez jest binarySearch.

0

Wielkie dzięki, śmiga.

1 użytkowników online, w tym zalogowanych: 0, gości: 1