Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Java


Автор: Aleksiusss 22.6.2006, 14:10
Имееется текстовый файл, который содержит данные (Фамилия, Имя, телефон) в виде:
Пупкин Вася
00-00-00-00
Непупкин Вася
11-11-11-11
Пипкин Вася
22-22-22-22
Непипкин Вася
44-44-44-44

Имеется программка которая считывает данные в карту отображений  и выводит на экран отсортированные по естественному признаку элементы этой карты. 

Код

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

public class TMap
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
        String name, phone;
        
        TreeMap map = new TreeMap();
        
        while((name = reader.readLine()) != null && (phone = reader.readLine()) != null)
        {
            map.put(name, phone);
        }
        reader.close();
        
        Set set = map.entrySet();
        Iterator i = set.iterator();
        
        try
        {
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(System.out, "Cp866"), true);
            
            while(i.hasNext())
            {
                Map.Entry my = (Map.Entry)i.next();
                writer.println(my.getKey() + " телефон " + my.getValue());
            }
            
            System.out.println("\n");
        }
        catch(UnsupportedEncodingException e)
        {
            System.err.println(e);
        }
    }
}


Нужно:
Изменить вывод  программы на следующий. Пользователь вводит с клавиатуры фамилию и получает телефонный номер, закрепленный за данной фамилией. Учтите пользовательские ошибки.

 

Автор: LSD 22.6.2006, 22:12
В файле хранится имя и фамилия, их надо разбивать на составляющие или пользователь тоже должен вводить их полностью? Поиск регистрозависимый? 

Автор: Aleksiusss 23.6.2006, 10:33
Цитата(LSD @ 22.6.2006,  22:12)
В файле хранится имя и фамилия, их надо разбивать на составляющие или пользователь тоже должен вводить их полностью? Поиск регистрозависимый?

1. Да, надо разбить на составляющие.
2. Нет. 

Автор: LSD 24.6.2006, 16:05
Код
import java.io.*;
import java.util.*;

public class SMap
{
  public static void main(String[] args) throws IOException
  {
    String fullName, phone;
    TreeMap<String, String> namePhoneMap = new TreeMap<String, String>();
    TreeMap<String, ArrayList<String>> lastNames = new TreeMap<String, ArrayList<String>>();

    BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
    while((fullName = reader.readLine()) != null && (phone = reader.readLine()) != null)
    {
      namePhoneMap.put(fullName, phone);
      String lastName = fullName.substring(0, fullName.indexOf(' ')).toLowerCase();
      ArrayList<String> list = lastNames.get(lastName);
      if(list == null)
      {
        list = new ArrayList<String>();
        lastNames.put(lastName,  list);
      }
      list.add(fullName);
    }
    reader.close();

    Set<Map.Entry<String, String>> set = namePhoneMap.entrySet();

    for(Map.Entry<String, String> my : set)
      System.out.println(my.getKey() + " phone " + my.getValue());

    BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("Input last name: ");
    System.out.flush();
    String lastName = inReader.readLine().trim().toLowerCase();
    ArrayList<String> list = lastNames.get(lastName);
    if(list == null || list.size() == 0)
    {
      System.out.println("Noting found");
    }
    else
    {
      System.out.println("Found: ");
      for(String name: list)
        System.out.println("  " + name + " phone " + namePhoneMap.get(name));
    }
  }
}
 

Автор: Aleksiusss 29.6.2006, 15:36
Можно поподробнее объяснить логику работы нижеследующего ?

1.
Код

ArrayList<String> list = lastNames.get(lastName);
      if(list == null)
      {
        list = new ArrayList<String>();
        lastNames.put(lastName,  list);
      }
      list.add(fullName);
    }


2.
Код

Set<Map.Entry<String, String>> set = namePhoneMap.entrySet();

    for(Map.Entry<String, String> my : set)
      System.out.println(my.getKey() + " phone " + my.getValue());

3.
Код

ArrayList<String> list = lastNames.get(lastName);
    if(list == null || list.size() == 0)
    {
      System.out.println("Noting found");
    }
    else
    {
      System.out.println("Found: ");
      for(String name: list)
        System.out.println("  " + name + " phone " + namePhoneMap.get(name));
    }



 

Автор: LSD 29.6.2006, 21:30
1. Я исходил из того, что ФИО уникальны, а просто фамилия может быть и не уникальна. Поэтому в lastNames для каждой фамилии, храним список ФИО.

2. 
Цитата(Aleksiusss @  22.6.2006,  15:10 Найти цитируемый пост)
выводит на экран отсортированные по естественному признаку элементы этой карты


3. 
Цитата(Aleksiusss @  22.6.2006,  15:10 Найти цитируемый пост)
получает телефонный номер, закрепленный за данной фамилией
 

Автор: Aleksiusss 29.6.2006, 21:54
Еще вопрос.

Код

TreeMap<String, String> namePhoneMap = new TreeMap<String, String>();


Зачем нужно:  <String, String> 

Автор: LSD 2.7.2006, 15:41
Это генерики (generics) - параметризованные классы, подробнее в http://vingrad.ru/JAVA-ART-001433. 

Автор: Aleksiusss 3.7.2006, 17:34
А можно вот этот код

Код

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

public class SMap
{
  public static void main(String[] args) throws IOException
  {
    String fullName, phone;
    TreeMap<String, String> namePhoneMap = new TreeMap<String, String>();
    TreeMap<String, ArrayList<String>> lastNames = new TreeMap<String, ArrayList<String>>();

    BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
    while((fullName = reader.readLine()) != null && (phone = reader.readLine()) != null)
    {
      namePhoneMap.put(fullName, phone);
      String lastName = fullName.substring(0, fullName.indexOf(' ')).toLowerCase();
      ArrayList<String> list = lastNames.get(lastName);
      if(list == null)
      {
        list = new ArrayList<String>();
        lastNames.put(lastName,  list);
      }
      list.add(fullName);
    }
    reader.close();

    Set<Map.Entry<String, String>> set = namePhoneMap.entrySet();

    for(Map.Entry<String, String> my : set)
      System.out.println(my.getKey() + " phone " + my.getValue());

    BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("Input last name: ");
    System.out.flush();
    String lastName = inReader.readLine().trim().toLowerCase();
    ArrayList<String> list = lastNames.get(lastName);
    if(list == null || list.size() == 0)
    {
      System.out.println("Noting found");
    }
    else
    {
      System.out.println("Found: ");
      for(String name: list)
        System.out.println("  " + name + " phone " + namePhoneMap.get(name));
    }
  }
}


переписать без
1. Generics - параметризованные классы.
2. The For-Each Loop – улучшенный вариант цикла прохождения по коллекции (используя обыкновенный цикл).

У меня не компилируеться этот код , наверное из-за того , что у меня стоит более старая версия jdk.
Сам пробывал переписать , но у меня не получаеться.

Заранее большое спасибо. 

Автор: LSD 3.7.2006, 23:17
Код
import java.io.*;
import java.util.*;

public class SMap
{
  public static void main(String[] args) throws IOException
  {
    String fullName, phone;
    TreeMap namePhoneMap = new TreeMap();
    TreeMap lastNames = new TreeMap();

    BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
    while((fullName = reader.readLine()) != null && (phone = reader.readLine()) != null)
    {
      namePhoneMap.put(fullName, phone);
      String lastName = fullName.substring(0, fullName.indexOf(' ')).toLowerCase();
      ArrayList list = (ArrayList) lastNames.get(lastName);
      if(list == null)
      {
        list = new ArrayList();
        lastNames.put(lastName, list);
      }
      list.add(fullName);
    }
    reader.close();

    Set set = namePhoneMap.entrySet();

    for(Iterator iterator = set.iterator(); iterator.hasNext();)
    {
      Map.Entry my = (Map.Entry) iterator.next();
      System.out.println(my.getKey() + " phone " + my.getValue());
    }

    BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("Input last name: ");
    System.out.flush();
    String lastName = inReader.readLine().trim().toLowerCase();
    ArrayList list = (ArrayList) lastNames.get(lastName);
    if(list == null || list.size() == 0)
    {
      System.out.println("Noting found");
    }
    else
    {
      System.out.println("Found: ");
      for(Iterator iterator = list.iterator(); iterator.hasNext();)
      {
        Object name = iterator.next();
        System.out.println("  " + name + " phone " + namePhoneMap.get(name));
      }
    }
  }
}
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)