Назад | Начало урока | Вперед
Содержание

Глава 6

Задача 6.2 "Таблица расстояний."

В атласе часто публикуются таблицы рассотояний между важнейшими городами, названия которых служат заголовками столбцов и колонок. В Java мы не можем создать такую таблицу в виде двумерного массива, поскольку ряды и колонки в ней являются строками, а не целыми числами. Решение заключается в применении хеш-таблицы, где ключами являются названия городов, а значениями - числа, которые послужат индексами для двумерной матрицы расстояний между городами (то есть каждому городу будет присвоен номер, а по двум номерам-индексам можно будет обращаться к двумерному массиву). Напишите программу, которая:

- охватывает до 20 городов и случайным образом генерирует значения рассояний от 50 до 1000 километров.
- использует интерфейс класса Display для задания расстояний между любыми двумя городами.

Решение 1

Поскольку заданы две задачи, то сделаем два решения.
Сопряжение хеш-таблицы и двумерной матрицы представляется интересным.
Создадим два массива: массив городов и массив индексов.

String sity[] = {"Sidney","London","Paris","Chikago","Roma","Bucharest","Moscou","Kiev","Helsinky","Bagdad", "Khabarovsk","Omsk","Tomsk","Krasnoyarsk", "Novosibirsk","Ekaterinburg","StPetersburg","Sochi", "Volgograd","Saratov"};

String r[] = {"0","1","2","3","4","5","6","7","8","9",

"10","11","12","13","14","15","16","17","18","19"};

Для создания хеш-таблицы и заполения ее данными требуется всего две инструкции:
Hashtable table = new Hashtable();
table.put(sity[i],r[i]);

Массив индексов потребовался здесь потому, что в функцию table.put() в качестве параметров необходимо передать объекты. А строки у нас являются объектами. Можно использовать и другой способ: в цикле превратить переменные типа int в объекты Int, которые затем передать в параметры.

Функция, которая создает в цикле хеш-таблицу:

void putSityHashTab(){

for(int i=0; i < sity.length;i++){
table.put(sity[i],r[i]);
}
}

Затем создадим двумерную матрицу и заполним ее случайными значениями:

void putIndexTab(){

for(int i=0;i < sity.length;i++){
for (int j =0;j < sity.length;j++){
if(i==j){
indexTable[i][j]=0; continue;
}
if(i>j){
indexTable[i][j]=indexTable[j][i];
continue;
}
indexTable[i][j]=random_01(50,1000);
}
}
}

Вывести матрицу на экран для просмотра можно при помощи функции showIndexTab(). Эта функция выводит так же названия городов и их индексы.

Функция echo() выводит ключи хеш-таблицы.

Наконец функция transactions () считывает введенные пользователем названия городов, определяет их индексы, и используя эти индексы и двумерную матрицу выводит расстояние между двумя городами. (Которое функция putIndexTab сгенерировала случайным образом)

Программа хоть и интересна, но для практического применения бесполезна, потому, что расстояния между городами нереальны. Следующая программа ( Решение 2 ) позволит пользователю вводить в матрицу реальные расстояния между городами. А данную программу можно будет переделать так, что она будет считывать введенные заранее данные из файла в матрицу, и далее выдавать верные в практическом плане результаты (Решение 3).

Код программы:


import java.io.*;
import javagently.*;
import java.util.*;

class SityTable {

Display display = new Display ("Currency Converter");
int indexTable[][]=new int[20][20];
Hashtable table = new Hashtable();

String sity[] = {"Sidney","London","Paris","Chikago","Roma","Bucharest","Moscou","Kiev","Helsinky","Bagdad", "Khabarovsk","Omsk","Tomsk","Krasnoyarsk", "Novosibirsk","Ekaterinburg","StPetersburg","Sochi", "Volgograd","Saratov"};

String r[] = {"0","1","2","3","4","5","6","7","8","9",

"10","11","12","13","14","15","16","17","18","19"};

SityTable () throws IOException {

putSityHashTab();
putIndexTab();
showIndexTab();
echo();
transactions();
}
void putSityHashTab(){
for(int i=0; i < sity.length;i++){
table.put(sity[i],r[i]);
}
}
void putIndexTab(){
for(int i=0;i < sity.length;i++){
for (int j =0;j < sity.length;j++){
if(i==j){
indexTable[i][j]=0; continue;
}
if(i>j){
indexTable[i][j]=indexTable[j][i];
continue;
}
indexTable[i][j]=random_01(50,1000);
}
}
}

void showIndexTab(){

System.out.println("\n");
System.out.print("\t\t\t\t\t");

for(int i=0;i < r.length;i++)
System.out.print(r[i]+ "\t" );
System.out.println("\n");

for(int i=0;i < sity.length;i++){

String s = sity[i];
if(s.length() > 11){
System.out.print(sity[i]+ "\t" );
}
else{
if(s.length() > 7)
System.out.print(sity[i]+ "\t\t" );
else
System.out.print(sity[i]+ "\t\t\t" );
}
System.out.print(r[i]+ "\t" );

for (int j =0;j < sity.length;j++){

System.out.print(indexTable[i][j] + "\t");
}
System.out.println();
}
}

void echo() {

display.println("In the table");
int i = 1;
for (Enumeration e = table.keys(); e.hasMoreElements(); i++) {
String sityZ = (String)e.nextElement();
display.println(sityZ +" " + table.get(sityZ));
}
}
void transactions () {
display.prompt("Sity1", "London");
display.prompt("Sity2", "Paris");
String sity1;
String sity2;

while (true) {

display.println("Input the sityName");
display.ready("Enter sity1 and sity2 and press ready");
sity1 = display.getString("Sity1");
sity2 = display.getString("Sity2");

if (table.containsKey(sity1)& table.containsKey(sity2) ) {

String k =(String) table.get(sity1);
int k1 =(int) Double.valueOf(k).doubleValue();
String m =(String) table.get(sity2);
int m1 =(int) Double.valueOf(m).doubleValue();

display.println("Distance between "+sity1+ " end "+sity2+ " is "+indexTable[k1][m1]+" km" );

m1 = 0; k1 = 0;

}
else {
display.println("Sorry, sity "+sity1+ " or sity " +sity2 +" not in table\n");
}
} // while
} // transactions

public static void main(String[] args) throws IOException {

new SityTable ();
}

int random_01 (int min, int max ){

int z =0;
while(z < min ){
z = (int) (Math.random()* max);
}
return z;
}
} // class SityTable


Результат :

Подсказка

Подсказка


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz