Java编程实验课中使用到了正则表达式和Map.get方法,因为本人也遇到了很多问题,这里总结一下。
正则表达式
基础的语法就不讲了。这个网上有一堆基本用法和教程。来说一下我个人通过这次实验理解的。
正则表达式可以取或。
这是什么意思呢,就是如果我有两个判断条件,并不需要写使用两个Pattern类和Matcher类对两个表达式分别判断。只需要将两个表达式取或,就可以。用我的实验代码来说吧。
String regex = "^@[A-Za-z0-9-_]{1,}|[^A-Za-z0-9-_]{1,}@[A-Za-z0-9-_]{1,}"; Pattern pattern = Pattern.compile(regex); Matcher matcher;
这里这个regex就是我的正则表达式,其实是两个表达式的或,"^@[A-Za-z0-9-_]{1, }"和"[^A-Za-z0-9-_]{1, }@[A-Za-z0-9-_]{1, }"。具体表达式是什么意思就不细说了,我只是想通过这个例子说明,正则表达式是可以取或的。希望能帮助到初学者。
Map.get方法
还是同一个实验,用到了Map,其实这个问题的发现还是对Map类不熟悉,这里总结一下。
问题的产生是我用到了一个这样的Map:Map<String, Set<String>>然后需要通过key的值找到对应的value,在value中add一个新的String。一开始我是这样写的
Set<String> old = Map.get(key); old.add(Name);
然后问题就产生了。
我发现Map中所有跟old相同的Set中都添加了这个Name变量。很尴尬,这样我的程序不会崩溃,但是结果是不对的。
如果还没有理解我的问题,我就举一个例子。
比如一开始我的Map中键值对是:
{a = [able, athlete], b = [able], c = [able, athlete]}
然后我通过Map.get(a)找到了Set<String> old,接下来使用old.add("alike")。最后我发现Map变成了
{a = [able, athlete, alike], b = [able], c = [able, athlete, alike]}
c的value值也被改变了。
上网查阅也有同样的问题,考虑是因为Map为了节省空间,将相同的Set存在了同一个内存空间中,而且get方法得到的是引用,对某一个Set的修改会将内存空间中的内容修改,造成所有相同的Set都被修改。但是这只是个人的考虑,没有验证。
最后解决办法当然是自己手动copy一个新的Set出来了,然后add之后put回去,就会把原来的Set覆盖。。