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

Posted 专注如一

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)的主要内容,如果未能解决你的问题,请参考以下文章

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

算法习题---5.11邮件传输代理的交互(Uva814)

The Letter Carrier's Rounds(摘)

The Letter

ZooKeeper Commands: The Four Letter Words 获取监控状态

新概念英语(1-45)The boss's letter