扑克牌有两个属性,花色和牌面大小,可以分别比较花色和牌面大小是否递增或递减来确定是不是同花顺.但是由于扑克牌会有JQKA,所以牌面大小最好以数组或者字符串的方式实现,通过比较下标来比较大小,以下是大概的代码
public class PuKe {private String color
private String num
public String getColor() {
return color
}
public void setColor(String color) {
this.color = color
}
public String getNum() {
return num
}
public void setNum(String num) {
this.num = num
}
public PuKe(String color, String num) {
super()
this.color = color
this.num = num
}
public static void main(String[] args) {
List<PuKe>card = new ArrayList<PuKe>()
card.add(new PuKe("black", "2"))
card.add(new PuKe("black", "3"))
card.add(new PuKe("black", "4"))
card.add(new PuKe("black", "5"))
card.add(new PuKe("black", "6"))
//这里因为10是两位数且牌面里面用不到1,所以直接用1代替10
String check = "234567891JQKA"
boolean flage =true
//自定义比较器,用num在check里的下标大小作为比较依据排序
Collections.sort(card, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
PuKe er1 = (PuKe) o1
PuKe er2 = (PuKe) o2
Integer org1 = (int)(er1.getNum() == null ? 0.0 : check.indexOf(er1.getNum()))
Integer org2 = (int)(er1.getNum() == null ? 0.0 : check.indexOf(er2.getNum()))
return org1.compareTo(org2)
}
})
for (int i = 0 i < card.size()-1 i++) {
//遍历所有的牌,如果颜色不一样直接跳出循环,不是同花顺
if(!card.get(i).getColor().equals(card.get(i+1).getColor())){
flage =false
break
}
//如果上一张减去下一张的差值不是1,说明牌面不是顺子,也不是同花顺,跳出循环
if((int)check.indexOf(card.get(i+1).getNum())-(int)check.indexOf(card.get(i).getNum())!=1){
flage = false
break
}
}
if(flage){
System.out.println("牌面是同花顺")
}else{
System.out.println("牌面不是同花顺")
}
}
}
不过这种方法唯一不好的地方是check中不能直接用10,将来展示的时候需要判定,展示的是1时直接改成10.
其实实现方法很多,我这么写是因为最近在复习,这么写用到的知识点相对会多一点.
import java.io.BufferedReaderimport java.io.FileReader
/**
* 读取并解析文本文件
*/
public class ReadMusicInfo {
public static void main(String[] args) throws Exception {
//注意这里music.db文件的位置
BufferedReader in = new BufferedReader(new FileReader("D:/music.db"))
//保存读取的一行信息
String lineStr = null
//保存行信息按逗号分隔后的数据
String music[] = null
//先读取文件的一行内容
lineStr = in.readLine()
//如果读取的内容不为空
while(null != lineStr){
//按逗号分隔每一行的内容
music = lineStr.split(",")
//长度为5的为歌手的那行信息
if(5 == music.length){
System.out.println(
String.format(
"歌手:%s 地区:%s 相片:%s 专辑:%s 专辑包含歌曲数:%s",
music[0],music[2],music[3],music[1],music[4]
)
)
System.out.println("歌曲列表如下:")
}
//长度为2的为歌曲信息
else if(2 == music.length){
System.out.println("\t" + music[0] + "\t" + music[1])
}
// 其它信息原样输出
else{
System.out.println(lineStr)
}
lineStr = in.readLine()
}
in.close()
}
}
至于歌曲名后面的数字,我没有猜出来它的含义,是歌曲播放里长秒数吗?和题目无关了,反正都解析出来了,你可以按你的需要修改那些输出信息.
QQ:58472399
1.单循环判断数组中是否有存在重复值
这个取决于数组使用的数字,如果是字符串则没办法处理。
面试题:已知有一长度为100的无序随机整型数组,且数值范围是[1,100],写一算法,判断数组中是否有存在重复值,要求,不得嵌套循环,不得使用递归。
方法一:1publicboolCheckRepeat(int[]a)2{3//定义一个数组测试用,思想:数组的下标和值都是上一个数组元素中的值4int[]array=newint[101]5//将数组的值都复制到测试数组中6for(inti=0i<100i++)7{8inta=a[i]9array[a]=a//或者Array[a]=任何非零的数字,做标志用。10}1112//如果数组没有重复,则会填满测试数组,否则数组中将出现自动初始化的值13for(inti=1i<101i++)14{15//判断如果数组中有自动初始的值,则数组没有被填满16if(array[i]==0)17{18returnfalse19}20}21returntrue22}上述方法收集自网络,这个方法写的很巧妙,思路也很清晰,但看起来还是有些多余代码,尽管满足了题目要求,只使用了一重循环,但算法中使用了两个循环进行判断,感觉还不够简洁,下面改造算法为一个单循环:方法二:1publicboolCheckRepeat(int[]a)2{3int[]array=newint[101]//数组元素值初始化默认为04for(inti=0i<100i++)5{6inta=a[i]7if(array[a]!=0)//说明此元素已经赋过值了,即发生了重复8returntrue9else10array[a]=1//做标志用,也可赋任何不为0的数11}12returnfalse13}
2.字符串数组的情况Java代码/***判断数组内有无重复元素
*@paramargs
*@returntrue有重复|false无重复*/publicstaticbooleanhasRepeat(Object[]args){
Set<ObjecttempSet=newHashSet<Object()
for(inti=0i<args.lengthi++){
tempSet.add(args[i])}if(args.length==tempSet.size()){
returnfalse}else{returntrue}}/** * 判断数组内有无重复元素 * @param args * @return true 有重复 | false 无重复 */ public static boolean hasRepeat(Object[] args){ Set<Object tempSet = new HashSet<Object() for (int i = 0i <args.lengthi++) {tempSet.add(args[i]) } if(args.length == tempSet.size()){return false }else{return true } }
还可以通过其他方法:
1.两个for循环,依次判断是否相等,或先调用Arrays.sort(),然后再用Arrays.binarysearch()比较
2.把数组转化成一个用特殊字符分隔的字符串,然后用正则表达式里的\1,也就是第一个匹配结果,此方法效率较高。