UVA 814 The Letter Carrier's Rounds(JAVA基础map)

题解:就是按照题目模拟就好

   但是这个题目让我发现了我Java里面许多问题

   具体看代码,但是还是分为这几个方面

   属性的作用域问题,缓冲区问题,map与list映射的问题,输出多个空格不一定是/t,反转思想代码优化

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Main{

    // Map为接口不能实例化,所以需要实例化HashMap
    static Map<String, List<String>> map = new HashMap<String, List<String>>();
    // 多个类要用到 scanner,不能再每个类里面自己建立,否则缓冲区会出现问题
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        while (sc.hasNext()) {
            map.clear();
            while (true) {
                String type = sc.next();
                if ("*".equals(type)) {
                    while (!"*".equals(Solve()));
                    break;
                }
                String email, name;
                int num;
                email = sc.next();
                num = sc.nextInt();
                // 每次重构list,否则会清空之前还是map里面的值
                List<String> list = new ArrayList<String>();
                while (num > 0) {
                    name = sc.next();
                    //这儿直接存储邮件地址而不是只存name,后面就可以直接比较了
                    list.add(name+"@"+email);
                    --num;
                }
                map.put(email, list);
            }
        }
    }

    private static String Solve() {
        String sender;
        String[] recipient = new String[100000];
        sender = sc.next();
        if ("*".equals(sender))
            return sender;

        Set<String> set=new HashSet<String>();
        recipient[0] = sc.next();
        set.add(recipient[0]);
        int coun = 0;
        while (!"*".equals(recipient[coun])) {
            recipient[++coun] = sc.next();
            if(set.contains(recipient[coun])){
                coun--;
            }else{
                set.add(recipient[coun]);
            }
        }

        //去除回车
        sc.nextLine();
        String data = "";
        String temp=sc.nextLine();
        while (!"*".equals(temp)) {
            //将所有行都加入data中
            data=data+"     "+temp+"\n";
            temp=sc.nextLine();
        }

        int[] vis = new int[100000];
        for (int i=0;i<vis.length;++i)
            vis[i]=0;

        for (int i = 0; i < coun; ++i) {

            if (vis[i] == 0) {
                String senderName = Las(sender);
                String recipientName = Las(recipient[i]);
                System.out.println("Connection between " + senderName + " and " + recipientName);
                System.out.println("     HELO " + senderName);
                System.out.println("     250");
                System.out.println("     MAIL FROM:<" + sender + ">");
                System.out.println("     250");
                int flag = 0;
                for (int j = i; j < coun; ++j) {
                    if (vis[j] == 0 && recipientName!=null&& recipientName.length()!=0&& recipientName.equals(Las(recipient[j]))) {
                        vis[j] = 1;
                        System.out.println("     RCPT TO:<" + recipient[j] + ">");
                        if (Check(map.get(recipientName), recipient[j])) {
                            System.out.println("     250");
                            flag = 1;
                        } else {
                            System.out.println("     550");
                        }
                    }
                }
                if (flag == 1) {
                    System.out.println("     DATA");
                    System.out.println("     354");
                    System.out.print(data);
                    System.out.println("     .");
                    System.out.println("     250");
                }

                System.out.println("     QUIT");
                System.out.println("     221");
            }
        }
        return null;
    }

    private static boolean Check(List list, String com) {

        if (list == null || list.isEmpty())
            return false;
        for (Object i : list) {
            if (com!=null&& com.length()>0&&com.equals((String) i)) {
                return true;
            }
        }
        return false;
    }

    private static String Las(String string) {
        int i;
        for (i = 0; i < string.length(); ++i) {
            char temp = string.charAt(i);
            if (temp == ‘@‘) {
                ++i;
                break;
            }
        }
        String ans = "";
        for (; i < string.length(); ++i) {
            ans += string.charAt(i);
        }
        return ans;
    }

}

UVA 814 The Letter Carrier's Rounds(JAVA基础map)

时间: 2024-11-15 01:45:57

UVA 814 The Letter Carrier's Rounds(JAVA基础map)的相关文章

UVA 814 The Letter Carrier&#39;s Rounds

题目链接:https://vjudge.net/problem/UVA-814 题目翻译摘自<算法禁赛入门经典> 题目大意 本题的任务为模拟发送邮件时 MTA(邮件传输代理)之间的交互.所谓 MTA,就是 email地址格式 [email protected] 的“后面部分”.当某人从 [email protected] 发送给另一个人 [email protected] 时,这两个 MTA 将会通信.如果两个收件人属于同一个 MTA,发送者的 MTA 只需与这个 MTA 通信一次就可以把邮件

The Letter Carrier&#39;s Rounds UVA - 814

记这题主要是想记录两条经验,一个是要考虑数据的可重性,删去重复数据:二是跟上篇博客一样的错误,数组复写导致数据交叉而引起的奇妙bug.以后在类似复写情况要先考虑结尾元素,这两次都栽到这里,因为结尾元素没有更新但却用了...一定要记得把要用的数据但未更新的初始化,主要是考察当前所要使用数据的范围有无超出更新的范围. #include <iostream> #include <cstdio> #include <cstring> #include <map> #

The Letter Carrier&#39;s Rounds(摘)

Description For an electronic mail application you are to describe the SMTP-based communication that takes place between pairs of MTAs. The sender's User Agent gives a formatted message to the sending Message Transfer Agent (MTA). The sending MTA com

java基础-Map的静态初始化以及Map的遍历等.....................

1.map的静态初始化,以及map遍历的几种方法: package com.cy.test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Test { public static void main(String[] args) { Map<String, Integer> map = new HashMap

Java基础Map

LinkedHashMap类概述 Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序. import java.util.LinkedHashMap; import java.util.Set;   /*  * LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序.  * 由哈希表保证键的唯一性  * 由链表保证键盘的有序(存储和取出的顺序一致)  */ public class LinkedHashMapDemo { public static void 

java基础 Map集合

集合 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下 Collection接口是集合的根接口,没有蹄冻这个接口的直接实现类,但是却又其让其被继承的长   生的两个接口就是set与list .Set中不能包含重复的元素.List是一个有序的集合 List 有序  可重复的 List里存放的对象是有序的,同时也是可以重复的,list 关注的是索引,拥有一系列和索引相关的方法,查询速度快 因为是会伴随这后面数据的移动,所有插入删除数据速度慢 Set 无序 不能重复 Set是无序的

Java基础Map接口+Collections

1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Map集合的添加 */ Map<String, String> map = new HashMap<String, String>(); map.put("星期一", "Monday"); map.put("星期六", "

6、50道JAVA基础编程练习题跟答案

1 50道JAVA基础编程练习题 2 [程序1] 3 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 4 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 5 public class Prog1{ 6 public static void main(String[] args){ 7 int n = 10; 8 System.out.println("第"+n+

Java基础常见英语词汇

(转自http://www.jianshu.com/p/2743fe834166) Java基础常见英语词汇(共70个) ['?bd?ekt] ['?:rientid]导向的 ['pr??ɡr?m??]编程OO: object-oriented ,面向对象 OOP: object-oriented programming,面向对象编程 [d?'vel?pm?nt][k?t]工具箱 ['v??tj??l]虚拟的JDK:Java development kit, java开发工具包 JVM:java