对每个给定的分子式,求出每个原子的个数,按照原子字母表的顺序排列,并输出

题目:给出一个字符串格式的化学分子式,计算原子的个数每个化学元素都是由一个大写字母,或者一个大写字母后跟着若干个小写字母组成,例如H是一个化学元素,Mg也是一个化学元素。每个分子式中,原子的个数写在元素后面,如果原子个数是1,那么原子个数省略。例如H20和H202都是有效的分子式,但H102不是有效分子式。每个分子式中包含若干括号,为简单起见,分子式中只有括号每次输入一个分子式,对每个给定的分子式,求出每个原子的个数,按照原子字母表的顺序排列,并输出。

package test;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * 思路:对分子式进行遍历,先判断是元素是否符合要求,在判断元素是大小写或者是数字,如果是大写,对下一位进行判断是否是小写大写或数字,确认是否是原子,并
 * 产生响应的操作,如果是小写,则也需要判断下一位为是否大写或者数组或者小写,并产生响应的操作,如果是数组,也需要对下一位进行判断是大写或者数组,并产生响应操作,
 * 遍历完成后对讲所有的原子和个数值存储到map中,再对map中的key进行排序,最后打印出来
 */
public class JustClass {
  public static void main(String[] strs) {
    // 输入字符串
    Scanner sc = new Scanner(System.in);
    String s = sc.nextLine();

    // 定义map
    Map<String, Integer> hh = new HashMap<String, Integer>();

    // 检查分子式是否合格
    if (s.contains("1")) {
      System.out.println("非有效的分子格式");
      return;
    }

    // 0~9数字对应十进制48-57
    // a~z字母对应的十进制97-122 十六进制61-7A
    // A~Z字母对应的十进制65-90 十六进制41-5A

    // 定义两个变量存储原子元素和个数
    String lowchar = "";
    String num = "";

    // 遍历
    for (int i = 0; i < s.length(); i++) {
      // //判断是否是括号,如果有跳出本次循环
      // if((s.charAt(i)+"").equals("(") || (s.charAt(i)+"").equals(")")){
      // continue;
      // }

      // 判断第一位字符
      if (i == 0) {
        // 判断是否大写
        if (90 <= ((int) s.charAt(i)) || ((int) s.charAt(i)) <= 65) {
          System.out.println("非有效的分子格式");
          return;
        } else {

          // 判断字符下一位是否小写,是小写先存储到string中
          if (97 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 122) {
            lowchar = s.charAt(i) + "";
          } else if (50 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 57) { // 判断字符下一位是否数字
            lowchar = s.charAt(i) + "";
          } else if (65 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 90) { // 判断字符下一位是否大写
            hh.put(s.charAt(i) + "", 1);
          } else {
            System.out.println("非有效的分子格式");
            return;
          }
        }
      }

      // 判断最后一位之前的字符
      if (i != 0 && i < s.length() - 1) {
        // 如果i是大写字符
        if (65 <= ((int) s.charAt(i)) && ((int) s.charAt(i)) <= 90) {
          // 判断字符下一位是否小写,是小写先存储到string中
          if (97 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 122) {
            lowchar = s.charAt(i) + "";
          } else if (50 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 57) { // 判断字符下一位是否数字
            lowchar = s.charAt(i) + "";
          } else if (65 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 90) {
            // 如果map中已经包含了a则值加一
            if (hh.containsKey(s.charAt(i))) {
              int v = hh.get(s.charAt(i)) + 1;
              hh.remove(s.charAt(i));
              hh.put(s.charAt(i) + "", v);
            } else {
              hh.put(s.charAt(i) + "", 1);
            }
          } else {
            System.out.println("非有效的分子格式");
            return;
          }
        }
        // 如果i是数字
        if (50 <= ((int) s.charAt(i)) && ((int) s.charAt(i)) <= 57) {
          // i下一位是大写
          if (65 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 90) {
            num = num + s.charAt(i) + "";
            // 如果map中已经包含了a则值加一
            if (hh.containsKey(lowchar)) {
              hh.remove(lowchar);
              hh.put(lowchar, Integer.valueOf(num));
            } else {
              hh.put(lowchar, Integer.valueOf(num));
            }

            // 清空
            num = "";
            lowchar = "";
          } else if (50 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 57) {
            num = num + s.charAt(i) + "";
          } else {
            System.out.println("非有效的分子格式");
            return;
          }
        }

        // i是小写
        if (97 <= ((int) s.charAt(i)) && ((int) s.charAt(i)) <= 122) {
          // 下一位是大写
          if (65 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 90) {
            lowchar = lowchar + s.charAt(i) + "";
            // 如果map中已经包含了a则值加一
            if (hh.containsKey(lowchar)) {
              hh.remove(lowchar);
              hh.put(lowchar, 1);
            } else {
              hh.put(lowchar, 1);
            }

            // 清空
            num = "";
            lowchar = "";
          } else if (50 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 57) { // 是数字存储到str中
            lowchar = lowchar + s.charAt(i);
          } else if (97 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 122) {
            lowchar = lowchar + s.charAt(i);
          } else {
            System.out.println("非有效的分子格式");
            return;
          }
        }

      }
      // 对最后一位字符进行处理
      if (i == s.length() - 1) {
        // 如果i是大写字符
        if (65 <= ((int) s.charAt(i)) && ((int) s.charAt(i)) <= 90) {
          // 如果map中已经包含了a则值加一
          if (hh.containsKey(s.charAt(i))) {
            int v = hh.get(s.charAt(i)) + 1;
            hh.remove(s.charAt(i));
            hh.put(s.charAt(i) + "", v);
          } else {
            hh.put(s.charAt(i) + "", 1);
          }
        } else if (97 <= ((int) s.charAt(i)) && ((int) s.charAt(i)) <= 122) { // 如果小写
          lowchar = lowchar + s.charAt(i) + "";
          // 如果map中已经包含了a则值加一
          if (hh.containsKey(lowchar)) {
            hh.remove(lowchar);
            hh.put(lowchar, 1);
          } else {
            hh.put(lowchar, 1);
          }
        } else if (50 <= ((int) s.charAt(i)) && ((int) s.charAt(i)) <= 57) {
          num = num + s.charAt(i) + "";
          // 如果map中已经包含了a则值加一
          if (hh.containsKey(lowchar)) {
            hh.remove(lowchar);
            hh.put(lowchar, Integer.valueOf(num));
          } else {
            hh.put(lowchar, Integer.valueOf(num));
          }
        }
      }
    }

    // 排序
    String[] sr = BubbleSort(hh);
    // 打印map
    for (int i = 0; i < sr.length; i++) {
      System.out.println(sr[i] + "     " + hh.get(sr[i]));
    }
  }

  /**
   * @time 2019年11月6日上午9:28:22
   * @author lll
   * @describe BubbleSort
   */
  private static String[] BubbleSort(Map<String, Integer> hh) {
    String[] ss = new String[hh.size()];
    int m = 0;
    for (String re : hh.keySet()) {
      ss[m] = re;
      m++;
    }
    for (int i = 0; i < ss.length; i++) {
      for (int j = i; j < ss.length; j++) {
        if ((int) ss[i].charAt(0) > (int) ss[j].charAt(0)) {
          String key = ss[i];
          ss[i] = ss[j];
          ss[j] = key;
        }
      }
    }
    return ss;
  }
}

 

©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值