如何给Set集合排序,详情见问题说明?

有A(id,create_time,b) B(id,name,create_time)两个bean

把这A放到set集合中,如何对这个集合进行排序?

4个回答

没啥答案,结束提问!!!!!!!!!!!!

SortedSet,让你的bean实现排序的接口就行了。

u013179958
CSDNRGY 树集里面放不了对象,我昨天试了,一放对象就报错
接近 4 年之前 回复

你确定只能用Set集合吗,用List可以吗?如果用List可以的话,那么可以直接用Collections类提供的sort方法对集合进行排序。
需要先修改A类的定义,实现comparable接口,重写compare方法,该方法中指明需要比较的字段及比较过程。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
如何把这个set转换程list集合 并且按照要求排序啊
用hibernate时 实体用set集合来关联的时候 如何把这个set转换程list集合 并且按照要求排序啊。就比如:Student 有teacher属性, 在查出student的时候,teacher是set集合,怎样把他转换成list集合,同时可以按照要求排序(如:teacher有age属性,按age大小排序)
怎么理解Set集合中的HashSet中的元素是无序的?
怎么理解Set集合中的HashSet中的元素是无序的? Set集合中对象是不按特定顺序排序,并且对象没有重复的.而Set的一个实现类:HashSet是按照hash算法来存取集合中的对象的.hash是: 对象值-->哈希码-->元素位置 .所以我有个疑问:"Set集合中对象是不按特定顺序排序" 与 "HashSet的中的对象值和元素位置的对应" 是不是有点矛盾?或者说有点别扭. 这应该是个理解问题,请指正我的叙述并帮忙回答我的疑问? 感激!
通过操作得到一个set 集合,怎么按照一定规则进行?谢谢~~~~~~~~~
我网上差了半天,都是有add的过程,add时候就对该set进行排序了。 我想知道,如果我这个set已经添加完了,我直接取到的是个无序的set集合,怎么对该set进行排序。 谢谢~~~~~ http://topic.csdn.net/t/20050428/13/3973303.html 他这个方法在我这里好像执行不行,不知道是什么原因? [b]问题补充:[/b] 我没有存入的这个过程,直接通过hibernate从一个对象对应中取出一个无序的set集合,然后想进行排序,再在页面上渲染出来,以上方法不能实现啊。
关于集合类运用Comparator排序的问题!
<pre name="code" class="java">import java.util.Comparator; import java.util.Set; import java.util.TreeSet; class User { private String name; private String age; private String grade; public User(String name, String age, String grade) { super(); this.name = name; this.age = age; this.grade = grade; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getGrade() { return grade; } public void setGrade(String grade) { this.grade = grade; } public String toString(){ return name+"["+age+"] :"+grade; } public static void main(String[] args) { Set users=new TreeSet(new Comparator(){ public int compare(Object o1, Object o2) { User user1=(User)o1; User user2=(User)o2; if(user1.getName().equals(user2.getName())&amp;&amp;user1.getAge().equals(user2.getAge())){ return 0; } int flag=user1.getGrade().compareTo(user2.getGrade()); if(flag==0){ flag=user1.getName().compareTo(user2.getName()); if(flag==0){ return user1.getAge().compareTo(user2.getAge()); } } return flag; } }); users.add(new User("billx","23","90")); users.add(new User("bill","23","180")); users.add(new User("are","23","200")); System.out.println(users); } } </pre> <p> 上面代码执行的结果是<strong><span style="color: #ff0000;">:[bill[23] :180, are[23] :200, billx[23] :90]</span></strong></p> <p><span style="color: #000000;">可是我期望的结果是</span><span style="color: #ff0000;"><strong>:[billx[23] :90,bill[23] :180, are[23] :200 ]</strong></span></p> <p><strong><span style="color: #000000;">题目的需求是依据用户信息排序如果用户名和年龄相同认为是同一用户,集合内用户不重复,按照成绩,姓名,年龄升序排列答应出用户信息!</span></strong></p> <p><strong></strong></p> <p><strong>请问我上面哪边错了 ,应该怎么写????</strong></p> <p><strong></strong></p> <p> </p><br /><strong>问题补充:</strong><br />我没有注意注意类型无语了,请问如果是从一个大的文本文件中获取用户信息需要如何改动才能够提高性能!!!<br /><strong>问题补充:</strong><br /><strong><span style="color: red">这个问题并没有结束,因为我在测试的时候,有时用户名和年龄相等时,任然会显示出来,我想说的是User对象是不是还要overload hashcode和equals方法呢,不然光用户名和年龄相等时并不会认为是同一个用户!~!!</span></strong>
帮忙看下导入导出 和排序有问题 没有 本人新手也看不出啥问题,就运行不出来 ,学生类我放在后面的。
package xuejiguanli; import jxl.*; import jxl.Workbook; import jxl.format.Colour; import jxl.format.UnderlineStyle; import jxl.format.VerticalAlignment; import jxl.read.biff.BiffException; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException; import jxl.write.Label; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Scanner; import javax.swing.GroupLayout.Alignment; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; //-------------------------------------------------------------------这是成绩管理系统的主界面 public class xueshengdei{ public static void main(String[] args) { List<Student> Students = new ArrayList<>(); while(true) { //----------------------------------------------------------------------菜单 System.out.println("-----------------学生管理系统----------------"); System.out.println("-------欢迎使用重庆工程学院学籍管理系统-------"); System.out.println("你可以使用的功能如下:^_^"); System.out.println(" 1-------------增加学生信息"); System.out.println(" 2-------------删除学生信息"); System.out.println(" 3-------------修改学生信息"); System.out.println(" 4-------------查看单独学生信息"); System.out.println(" 5-------------查看所有学生的信息"); System.out.println(" 6-------------对当前所有学生进行升序排序"); System.out.println(" 7-------------查看学校通知"); System.out.println(" 8-------------导入学生信息"); System.out.println(" 9-------------导出学生信息"); System.out.println(" 10------------退出该系统"); Scanner sc =new Scanner(System.in); System.out.println("请输入序号选择其对应的功能:"); String j = sc.nextLine(); switch (j) { case "1": //增加学生 addstudent(Students); break; case "2": //删除学生 deletestudent(Students); break; case "3": //修改学生 changestudent(Students); break; case "4": //单独查找 singlefind(Students); break; case "5": //查看所有学生 findstudent(Students); break; case "6": //排序 System.out.println("请输入你要是实现的排序功能:"); Scanner s =new Scanner(System.in); System.out.println("1---------------成绩排序:"); System.out.println("2---------------年龄排序:"); System.out.println("3---------------学号排序:"); String second=s.nextLine(); switch(second) { case "1": paixu(Students);break; case "2": paixu3(Students); break; case "3": paixu2(Students); break; } break; case "7": tongzhi(Students); //查看学校通知 break; case "8": exceldaoru(Students); //导入学生信息 break; case "9": daochu(Students); //导出学生信息 break; case "10": System.out.println("谢谢你的使用!"); System.exit(0);//退出 default: System.out.println("输入错误请重新输入!"); break; } } } //--------------------------------------------------------------导出 public static void daochu(List<Student> Students) { String excelpath; Scanner scanner=new Scanner(System.in); System.out.println("操作:导出数据"); System.out.println("请输入导出Excel文件路径:"); excelpath = scanner.next(); try { FileOutputStream fos = new FileOutputStream(excelpath); WritableWorkbook wwb = Workbook.createWorkbook(fos); // 创建工作表 WritableSheet ws = wwb.createSheet("学生学籍表", 10); // 设置单元格的文字格式 WritableFont wf = new WritableFont(WritableFont.ARIAL, 12, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK); WritableCellFormat wcf = new WritableCellFormat(wf); wcf.setVerticalAlignment(VerticalAlignment.CENTRE); ws.setColumnView(4, 10); ws.setColumnView(5, 16); ws.setColumnView(0, 14); ws.addCell(new Label(0, 0, "学号", wcf)); ws.addCell(new Label(1, 0, "姓名", wcf)); ws.addCell(new Label(2, 0, "年龄", wcf)); ws.addCell(new Label(3, 0, "性别", wcf)); ws.addCell(new Label(4, 0, "成绩", wcf)); // 填充数据的内容 // 匹配学生学号 System.out.println("所有学生学籍信息如下:"); int cnt = 1; while (cnt <= Students.size()) { Student s = (Student) Students.get(cnt - 1); ws.addCell(new Label(4, cnt, String.valueOf(s.getId()), wcf)); ws.addCell(new Label(1, cnt, String.valueOf(s.getName()), wcf)); ws.addCell(new Label(2, cnt, String.valueOf(s.getAge()), wcf)); ws.addCell(new Label(3, cnt, String.valueOf(s.getSex()), wcf)); ws.addCell(new Label(4, cnt, String.valueOf(s.getScore()), wcf)); cnt++; if (cnt == 0) wcf = new WritableCellFormat(); } wwb.write(); wwb.close(); System.out.println("学生信息导出成功!"); } catch (IOException e) { e.printStackTrace(); } catch (RowsExceededException e) { e.printStackTrace(); } catch (WriteException e) { e.printStackTrace(); } } //---------------------------------------------------------------导入 public static void exceldaoru(List<Student> Students) { Scanner scanner=new Scanner(System.in); String excelpath; excelpath = scanner.next(); WritableWorkbook book = null; try { // 创建一个Excel文件对象 FileOutputStream fos = new FileOutputStream(excelpath); // 创建Excel第一个选项卡对象 WritableWorkbook book1 = Workbook.createWorkbook(new File(excelpath)); WritableSheet sheet = book1.createSheet("第一页", 0); // 设置表头,第一行内容 // Label参数说明:第一个是列,第二个是行,第三个是要写入的数据值,索引值都是从0开始 Label label1 = new Label(0, 0, "学号");// 对应为第1列第1行的数据 Label label2 = new Label(1, 0, "姓名");// 对应为第2列第1行的数据 Label label3 = new Label(2, 0, "年龄");// 对应为第3列第1行的数据 Label label4 = new Label(3, 0, "性别");// 对应为第4列第1行的数据 // 添加单元格到选项卡中 sheet.addCell(label1); sheet.addCell(label2); sheet.addCell(label3); sheet.addCell(label4); // 遍历集合并添加数据到行,每行对应一个对象 for (int i = 0; i < Students.size(); i++) { Student s = Students.get(i); // 表头占据第一行,所以下面行数是索引值+1 // 跟上面添加表头一样添加单元格数据,这里为了方便直接使用链式编程 sheet.addCell(new Label(0, i + 1, s.getId()+"")); sheet.addCell(new Label(1, i + 1, s.getName())); sheet.addCell(new Label(2, i + 1, s.getAge()+"")); sheet.addCell(new Label(3, i + 1, s.getSex())); sheet.addCell(new Label(4, i + 1, s.getScore()+"")); } // 写入数据到目标文件 book.write(); } catch (Exception e) { e.printStackTrace(); } finally { try { // 关闭 book.close(); } catch (Exception e) { e.printStackTrace(); } } } //----------------------------------------------------------------------------------通知 public static void tongzhi(List<Student> Students) { int index = -1; if(Students.size()==0) { System.out.println("请你输入学生后再来查看通知,谢谢!"); return; } int[] point = new int[100]; for (int i = 0; i < Students.size(); i++) { Student s = Students.get(i); point[i] = s.getScore(); } for (int i = 0; i < Students.size(); i++) { if (point[i]<60){ Student s = Students.get(i); System.out.println(s.getName()+"同学,你收到的通知如下:"); System.out.println("恭喜你挂科了"); System.out.println("恭喜你挂科了"); System.out.println("恭喜你挂科了"); System.out.println("重要的事情说三遍"); } else { Student s = Students.get(i); System.out.println(s.getName()+"同学,你收到的通知如下:"); System.out.println("哎呦不错哟"); System.out.println("恭喜你没有挂科"); } } } //-----------------------------------------------------------------------------------成绩排序 public static void paixu(List<Student> Students) { if(Students.size()==0) { System.out.println("不好意思,目前还没有学生的信息可供排序,请返回重新操作!"); return; } int[] point = new int[100]; for (int i = 0; i < Students.size(); i++) { Student s = Students.get(i); point[i] = s.getScore(); Arrays.sort(point); } for (int j = 0; j < point.length; j++) { for (int i = 0; i < Students.size(); i++) { if (point[j]==Students.get(i).getScore()){ Student s = Students.get(i); System.out.println("学号\t姓名\t年龄\t性别\t成绩"); System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getSex()+"\t"+s.getScore()); } } } } //--------------------------------------------------------------------学号排序 public static void paixu2(List<Student> Students) { if(Students.size()==0) { System.out.println("不好意思,目前还没有学生的信息可供排序,请返回重新操作!"); return; } int[] point = new int[10000000]; for (int i = 0; i < Students.size(); i++) { Student s = Students.get(i); point[i] = s.getId(); Arrays.sort(point); } for (int j = 0; j < point.length; j++) { for (int i = 0; i < Students.size(); i++) { if (point[j]==Students.get(i).getId()){ Student s = Students.get(i); System.out.println("学号\t姓名\t年龄\t性别\t成绩"); System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getSex()+"\t"+s.getScore()); } } } } //---------------------------------------------------------------------------------------年龄排序 public static void paixu3(List<Student> Students) { if(Students.size()==0) { System.out.println("不好意思,目前还没有学生的信息可供排序,请返回重新操作!"); return; } int[] point = new int[100]; for (int i = 0; i < Students.size(); i++) { Student s = Students.get(i); point[i] = s.getAge(); Arrays.sort(point); } for (int j = 0; j < point.length; j++) { for (int i = 0; i < Students.size(); i++) { if (point[j]==Students.get(i).getAge()){ Student s = Students.get(i); System.out.println("学号\t姓名\t年龄\t性别\t成绩"); System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getSex()+"\t"+s.getScore()); } } } } //-------------------------------------------------------------------------------------------添加 public static void addstudent(List<Student> Students) { //创建键盘录入对象 Scanner sc= new Scanner(System.in); while(true) { System.out.println("请输入学号:"); int id= sc.nextInt(); System.out.println("请输入姓名:"); String name = sc.nextLine(); System.out.println("请输入年龄:"); int age = sc.nextInt(); System.out.println("请输入性别:"); String sex = sc.nextLine(); System.out.println("请输入成绩:"); int score = sc.nextInt(); //创建学生对象 Student s = new Student(); s.setId(id); s.setName(name); s.setAge(age); s.setSex(sex); s.setScore(score); //把学生对象添加到集合 Students.add(s); break; } System.out.println("添加学生成功!"); } //-----------------------------------------------------------------------------------------(查找所有学生) public static void findstudent(List<Student> Students) { if(Students.size()==0) { System.out.println("不好意思,目前还没有学生的信息可供查询,请返回重新操作!"); return; } for(int i=0;i<Students.size();i++) { Student s = Students.get(i); System.out.println("学号:"+s.getId()+"\n姓名:"+s.getName()+"\n性别:"+s.getSex()+"\n年龄:"+s.getAge()+"\n成绩:"+s.getScore()); } } //----------------------------------------------单独查找----------------------------------------------- public static void singlefind(List<Student> students) { Scanner sc=new Scanner(System.in); System.out.println("请输入要查找的学号"); int findId=sc.nextInt(); int index = -1; for(int i=0;i<students.size();i++) { Student s = students.get(i); if(s.getId()==findId) { index=i; } if (index == -1) { System.out.println("你要查找的学生不存在,请重新选择!"); }else { System.out.println("学号:"+s.getId()+"\n姓名:"+s.getName()+"\n性别:"+s.getSex()+"\n年龄:"+s.getAge()+"\n成绩:"+s.getScore()); } } } //------------------------------------------------------------------------------------------------删除 public static void deletestudent(List<Student> Students) { Scanner sc= new Scanner(System.in); System.out.print("请输入要删除的学号:"); int deleId = sc.nextInt(); int index = -1; for(int i=0;i<Students.size();i++) { Student s = Students.get(i); if(s.getId()==deleId) { index=i; } if (index == -1) { System.out.println("你要删除的学生不存在,请重新选择!"); } else { Students.remove(index); System.out.println("删除学生成功!!"); } } } //---------------------------------------------------------------------------------------修改 public static void changestudent(List<Student> students) { Scanner sc= new Scanner(System.in); System.out.print("请输入要改变的学号:"); int changeId = sc.nextInt(); int index = -1; for(int i=0;i<students.size();i++) { Student s = students.get(i); if(s.getId()==changeId) { index = i; } } if (index == -1) { System.out.println("您要改变的学生不存在,请重新操作!"); } else { System.out.println("请输入新的姓名:"); String name = sc.nextLine(); System.out.println("请输入新的年龄:"); int age = sc.nextInt(); System.out.println("请输入新的性别:"); String sex = sc.nextLine(); System.out.println("请输入新的成绩:"); int score = sc.nextInt(); //创建学生对象 Student s = new Student(); s.setId(changeId); s.setName(name); s.setAge(age); s.setSex(sex); s.setScore(score); //修改学生对象 students.set(index,s); System.out.println("修改学生成功!!!"); } } } //学生类 package xuejiguanli; public class Student { private String name; private int Id; private int age; private String sex; private int score; public Student() { } public Student(String name, int Id, int age, String sex,int score) { super(); this.name = name; this.Id = Id; this.age = age; this.sex = sex; this.score =score; } public String getName() { return name; }//姓名 public int getId() { return Id; }//学号 public int getAge() { return age; }//年龄 public String getSex() { return sex; }//性别 public int getScore() { return score; }//成绩 public void setName(String name) { this.name = name; } public void setId(int Id) { this.Id = Id; } public void setAge(int age) { this.age = age; } public void setSex(String sex) { this.sex = sex; } public void setScore(int score) { this.score = score; } }
python 向列表中添加为什么总是空列表??
一个集合中没有重复元素,求该集合的所有子集。求集合的所有子集问题。题目要求子集中元素非递减序排列,因此我们先要对原来的集合进行排序。原集合中每一个元素在子集中有两种状态:要么存在、要么不存在。这样构造子集的过程中每个元素就有两种选择方法:选择、不选择,因此可以构造一颗二叉树,最后得到的叶子节点就是子集。。下面是Python代码,出现的问题用注释标出来了,如下: class Solution(object): def subsets(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ self.sub_sets=[] self.sub_set=[] nums.sort() self.dfs(nums,0) return self.sub_sets def dfs(self,nums,index): if index==len(nums): print self.sub_set #此处能够输出正确结果 self.sub_sets.append(self.sub_set)#向列表中添加子集时,为啥加入的总是[]????? return #选择nums[index] self.sub_set.append(nums[index]) self.dfs(nums,index+1) #不选择nums[index] self.sub_set.pop() self.dfs(nums,index+1) s=Solution() l=[1,2,3] print s.subsets(l) 运行结果如下: [1, 2, 3] [1, 2] [1, 3] [1] [2, 3] [2] [3] [] [[], [], [], [], [], [], [], []] #此处为什么全是空列表??在添加之前明明能够正常输出的!求解释。。。
Arduino C编程中free()函数挂机
最近我在尝试写一个描述机器人比赛场地的代码时,在内存分配上遇到了挂机的问题。代码在Arduino提供的编译平台上全部通过,但是在实际运行时,往往无法跑完测试程序。经过测试发现代码在obstacle对象的构造函数中调用的segajouter(segment tmp)的free(void*ptr)函数中挂机。Arduino使用的是Uno 主题测试程序如下: #include "ensemble.h" #include "segment.h" #include "jonction.h" #include "obstacle.h" ensemble set,set2;//结点集合类对象 long x=10,y=45,g=3,h=0;//设置参数 void setup() { Serial.begin(115200); Serial.println(F("Please input a digit:")); } void loop() { //===================================================== //Teste de la classe obstacle障碍物类测试 jonction test; if(Serial.available()>0) { Serial.print(F("Free Ram: "));//显示可用内存 Serial.println(freeRam());//显示可用内存 Serial.read(); Serial.print(set2.length()); for(int i=0;i<4;i++) { test.set_point(x,y); test.set_g(g); test.set_h(h); x=y-x; y=g+x; g=x*g; h=g-y; set2.ajouter(test); Serial.print(F("Free Ram: ")); Serial.println(freeRam()); output(set2.jonc()[i]);//输出读取内容(可能有出入) //因为添加结点时已经对集合中元素依据f()的大小 //排序 } Serial.print(F("Free Ram:"));//显示可用内存 Serial.println(freeRam());//显示可用内存 obstacle obs(set2); Serial.print(F("Free Ram:"));//显示可用内存 Serial.println(freeRam());//显示可用内存 Serial.print(F("NumJonc:"));//输出结点数 Serial.println(obs.NumJonc()); Serial.print(F("NumEdge:"));//输出边数 Serial.println(obs.NumEdge()); set=obs.jonc(); Serial.println(F("Set2:")); for(int i=0;i<set2.length();i++)//查看set2对象记录的结点 output(set2.jonc()[i]); Serial.println(F("Set:"));//查看set对象记录的结点 for(int i=0;i<set.length();i++) output(set.jonc()[i]); set.vide();//清空set对象 Serial.print(F("Length de set:"));//查看set对象元素个数 Serial.println(set.length()); x=h;//重新设置测试值 y=g; g=y-x; h=g/2; for(int i=0;i<2;i++) { test.set_point(x,y); test.set_g(g); test.set_h(h); x=y-x; y=g+x; g=y%x; h=g*x; set.ajouter(test);//更新set集合 } Serial.println(F("Set:"));//查看set元素 for(int i=0;i<set.length();i++) output(set.jonc()[i]); obstacle ob(set);//创建障碍物对象 if(ob==obs)//检测重载算符== Serial.println(F("True")); else { Serial.println(F("False")); ob.reset(set2);//重置ob,使得ob与obs相同 if(ob==obs)//检测重载算符== Serial.println(F("True")); else Serial.println(F("Err")); } } } //功能函数 void output(jonction test1)//输出结点参数 { Serial.print(F("(x,y,F,G,H)")); Serial.print('('); Serial.print(test1.getx()); Serial.print(','); Serial.print(test1.gety()); Serial.print(','); Serial.print(test1.f()); Serial.print(','); Serial.print(test1.g()); Serial.print(','); Serial.print(test1.h()); Serial.println(')'); } long input()//读取输入 { long n=0; boolean flag=false; char ch; if(Serial.available()>0) { ch=Serial.read(); if(ch=='-') { flag=true; delay(2); ch=Serial.read(); } n=long(ch-'0'); delay(2); } while(Serial.available()>0) { ch=Serial.read(); if((ch-'0')<10&&(ch-'0')>=0) n=10*n+long(ch-'0'); else break; delay(2); } if(flag) n*=-1; return n; } int freeRam ()//检测可用内存 { extern int __heap_start, *__brkval; int v; return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); } 类里头是这样定义的: #include "obstacle.h" #include "ensemble.h" #include "segment.h" #include "stdlib.h" #include "Arduino.h" int freeRam1 () { extern int __heap_start, *__brkval; int v; return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); } void obstacle::segajouter(segment tmp) //Generer une liste de segment dynamiquement //n indique le nombre des éléments de *s { segment *ss; n+=1; Serial.print(F("Hello ")); ss=(segment*)malloc(sizeof(tmp)*n); if (ss == NULL) Serial.println(F("malloc failed!")); for(int i=0;i<n-1;i++) ss[i]=edge[i]; ss[n-1]=tmp; // s=(segment*)realloc(edge,n*sizeof(tmp)); Serial.print(F("brave ")); // if(s!=NULL) // edge=s; // edge[n-1]=tmp; free(edge); Serial.println(F("world!")); edge=ss; ss=NULL; } obstacle::obstacle(ensemble set) { vertex=set; Serial.print(F("Free Ram: ")); Serial.println(freeRam1()); N=set.length(); n=0; Serial.println(F("Loop")); for(int i=0;i<N-1;i++) for(int j=i+1;j<N;j++) { segment tmp(vertex.jonc()[i],vertex.jonc()[j]); segajouter(tmp); Serial.print(F("i=")); Serial.print(i); Serial.print(F(" j=")); Serial.println(j); Serial.print(F("Free Ram: ")); Serial.println(freeRam1()); } } int obstacle::NumJonc() { return N; } int obstacle::NumEdge() { return n; } void obstacle::reset(ensemble set) { vertex=set; free(edge); N=set.length(); n=0; for(int i=0;i<N-1;i++) for(int j=i+1;j<N;j++) { segment tmp(vertex.jonc()[i],vertex.jonc()[j]); segajouter(tmp); } } ensemble obstacle::jonc() { return vertex; } segment* obstacle::Edge() { return edge; } boolean obstacle::operator ==(obstacle ob) { if(ob.jonc().length()==vertex.length()&&ob.jonc().jonc()==vertex.jonc()) return true; return false; } 以下是第一次在单片机上跑程序的反馈(由于原注释是部分使用法语的,可能与前面的程序的显示内容有点出入): Veuillez entrer huit nombres en les séparant par ' ': Free Ram: 1737 0Free Ram: 1713 (x,y,F,G,H)(10,45,3,3,0) Free Ram: 1667 (x,y,F,G,H)(35,38,172,105,67) Free Ram: 1599 (x,y,F,G,H)(3,108,522,315,207) Free Ram: 1509 (x,y,F,G,H)(105,420,65730,33075,32655) Free Ram:1509 Free Ram: 1435 Loop Hello brave world! i=0 j=1 Free Ram: 1435 Hello brave world! i=0 j=2 Free Ram: 1435 Hello brave world! i=0 j=3 Free Ram: 1301 Hello brave world! i=1 j=2 Free Ram: 1123 Hello brave world! i=1 j=3 Free Ram: 901 Hello brave world! i=2 j=3 Free Ram: 901 Free Ram:975 NumJonc:4 NumEdge:6 Set2: (x,y,F,G,H)(10,45,3,3,0) (x,y,F,G,H)(35,38,172,105,67) (x,y,F,G,H)(3,108,522,315,207) (x,y,F,G,H)(105,420,65730,33075,32655) Set: (x,y,F,G,H)(10,45,3,3,0) (x,y,F,G,H)(35,38,172,105,67) (x,y,F,G,H)(3,108,522,315,207) (x,y,F,G,H)(105,420,65730,33075,32655) Length de set:0 Set: (x,y,F,G,H)(33390,66780,0,0,0) (x,y,F,G,H)(0,33390,115621,33390,16695) Free Ram: 901 Loop Hello brave world! i=0 j=1 Free Ram: 901 False Hello brave world! He
在devcpp运行不能重复输出并集求求大佬们看看。
第一次在csdn求助!不知道规矩,希望各位大佬能够指点!谢谢大家! 下面是题目和代码,输入完两个集合以后输出两次并集就会出错,还有一个问题是怎么清空链表?? 被这两个问题折磨了一星期le ![图片说明](https://img-ask.csdn.net/upload/201905/22/1558533808_466333.png) ``` #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct node { int data; struct node* next; }node; int lenth(node* head); node* build();//创建链表 int IN_SET(node* p, node* head);//判断新元素是否在链表中存在 node* INSERT_SET(node* head);//插入链表 void output0(node* head); int compare(node* p, node* tail); node* Plus(node* head1, node* head2); int IN_SET(node* head1, node* head2); node* Cross(node* head1, node* head2); node* Oppo(node* head1, node* head2); int main() { node* LA = NULL; node* LB = NULL; node* head_c = NULL; node* head_d = NULL; node* head_e = NULL; int item; while (1) { system("color 9"); printf("\n0-退出 1-编写集合 2-插入元素 3-输出集合"); printf("\n4-输出交集 5-输出并集 6-输出对称差 \n"); printf("请选择要进行的操作:"); scanf("%d", &item); switch (item) { case(0): { exit(0); } case(1): { if (LA != NULL) { printf("已经存在链表!!"); break; } printf("\n创建集合A:"); LA = build(); printf("\n创建完毕"); printf("\n创建集合B:"); LB = build(); printf("\n创建完毕"); break; } case(2): { int t; printf("\n输入1将元素插入集合A,输入2将元素插入集合B:"); scanf("%d", &t); switch (t) { case(1): { LA = INSERT_SET(LA); node* temp1 = LA; while (temp1 != NULL) { printf("%d ", temp1->data); temp1 = temp1->next; } break; } case(2): { LB = INSERT_SET(LB); break; } } break; } case(3): { printf("\n输出A集合:\n"); output0(LA); printf("\n输出B集合:\n"); output0(LB); break; } case(4): { printf("\nA与B的交集为:\n"); head_d = Cross(LA, LB); output0(head_d); break; } case(5): { printf("A与B的并集为:\n"); head_c = Plus(LA, LB); output0(head_c); break; } case(6): { printf("A与B的对称差为:\n"); head_e = Oppo(LA, LB); output0(head_e); break; } } } } node* build() { int size, n = 0; node* head = NULL, * newnode = NULL; //node* MoveP = head; //node* EXMoveP = head; printf("\n请输入该集合大小:"); scanf("%d", &size); while (n < size) { n++; newnode = (node*)malloc(sizeof(node)); newnode->next = NULL; //printf("\n请输入你想增加的元素:"); //scanf("%d", &(newnode->data)); if (head == NULL)//头指针为空,则替换头指针中的值 { printf("\n请输入你想增加的元素:"); scanf("%d", &(newnode->data)); head = newnode; continue; } head = INSERT_SET(head);//用插入排序进行输入 } // MoveP = head;//(测试)输出链表,查看链表存储方式 // // while (MoveP!=NULL) // { // printf("%d ", MoveP->data); // MoveP = MoveP->next; // } return head; } void output0(node * head)//输出函数,已排序的数组从尾部倒着输出 { node* tempnode = head; int len = lenth(head); if (tempnode == NULL) { printf("空集"); return; } for (int i = 0; i < len; i++) { node* tail = head; for (int j = len; (j - i - 1) > 0; j--) { tail = tail->next; } printf("%d ", tail->data); } } int compare(node * p, node * tail)//比较两个传入节点的值的大小 ,前者大于后 者,则返回0,否则返回1。 { if (tail == NULL) return 0; if ((p->data) > (tail->data)) return 0; return 1; } node* INSERT_SET(node * head)//插入链表 { node* Head = head, * tail = head; if (head == NULL)//头指针为空,则说明创建链表不成功,或者未创建链表 { // printf("②"); printf("尚未创建集合,请重新输入"); return head; } while ((tail->next) != NULL)//将尾指针挪到正确位置 { tail = tail->next; } while (1)//无限循环,以下每一种条件都会有出口 { node* p = (node*)malloc(sizeof(p)); p->next = NULL; printf("\n请输入插入的元素:"); scanf("%d", &(p->data)); if (!IN_SET(head, p))//判断新元素是否已经存在 { printf("\n该元素已在集合中,请重新输入另一个值"); free(p); continue; } else { if ((p->data) > (tail->data))//如果新元素大于尾部,直接接上 { tail->next = p; tail = p; return head; } else { node* MoveP = (head->next);//操作指针,用于插入操作的时候连接后半部分链表 node* EXMoveP = head;//操作指针的前一指针,保证能够比较到每一个值 if ((p->data) < (head->data))//如果新元素比头部要小,则插在头部之前 { (p->next) = head; head = p; return head; } while ((EXMoveP->next) != NULL) { if ((p->data) < (MoveP->data))//如果比操作指针要小,则插在操作指针前 { (EXMoveP->next) = p;//先替换掉操作指针前一个指针的next入口,这两行不能打乱次序 (p->next) = MoveP; return head; } MoveP = (MoveP->next); EXMoveP = (EXMoveP->next);//向后拨动指针 } } } } } node* INSERT_SET0(node* head,node* newnode)//插入链表 { node* Head = head, * tail = head; if (head == NULL)//头指针为空,则说明创建链表不成功,或者未创建链表 { return head; } while ((tail->next) != NULL)//将尾指针挪到正确位置 { tail = tail->next; } while (1)//无限循环,以下每一种条件都会有出口 { node* p = (node*)malloc(sizeof(p)); p->data = newnode->data; p->next = NULL; if (!IN_SET(head, p))//判断新元素是否已经存在 { printf("\n该元素已在集合中,请重新输入另一个值"); free(p); return head; } else { if ((newnode->data) < (head->data))//尾部插入 { newnode->next = head; head = newnode; return head; } if ((p->data) > (tail->data))//如果新元素大于尾部,直接接上 { tail->next = p; tail = p; return head; } else { node* MoveP = (head->next);//操作指针,用于插入操作的时候连接后半部分链表 node* EXMoveP = head;//操作指针的前一指针,保证能够比较到每一个值 while ((EXMoveP->next) != NULL) { if ((p->data) < (MoveP->data))//如果比操作指针要小,则插在操作指针前 { (EXMoveP->next) = p;//先替换掉操作指针前一个指针的next入口,这两行不能打乱次序 (p->next) = MoveP; return head; } MoveP = (MoveP->next); EXMoveP = (EXMoveP->next);//向后拨动指针 } } } } } node* Plus(node * head1, node * head2)//取并集 { node* Head1 = head1, * Head2 = head2, * head3 = NULL, * p1 = NULL, * New_tail = NULL; while (Head1 != NULL) { node* p1 = (node*)malloc(sizeof(p1)); p1->next = NULL; (p1->data) = (Head1->data); if (head3 == NULL)//令头部和尾部先重合,以创建新链表 { head3 = p1; New_tail = p1; } else { New_tail->next = p1; New_tail = p1; } Head1 = Head1->next; } Head1 = head1; while (Head2 != NULL) { if (IN_SET(Head1, Head2))//如果Head1(整个链表)和Head2(一个节点)的值不一样,执行,将不一样的值插入新构建的链表中 { head3=INSERT_SET0(head3, Head2); } Head2 = Head2->next; } return head3; } int IN_SET(node * head1, node * head2)//在head1为头部的链表中查找是否有与head2节点的值相等的节点,有返回假(0),没有返回真(1) { node* Head1 = head1, * Head2 = head2; while (Head1 != NULL) { if ((Head1->data) == (Head2->data)) return 0; Head1 = Head1->next; } return 1; } node* Cross(node * head1, node * head2)//取交集 { node* Head1 = head1, * Head2 = head2, * head3 = NULL, * p1 = NULL, * New_tail = NULL; while (Head2 != NULL) { if (0 == IN_SET(Head1, Head2))//若 Head1链表中有与Head2相同的节点,取出,拼接成为新节点 { node* p1 = (node*)malloc(sizeof(p1)); p1->next = NULL; (p1->data) = (Head2->data); if (head3 == NULL) { head3 = p1; New_tail = p1; } else { New_tail->next = p1; New_tail = p1; } } Head2 = Head2->next; } return head3; } node* Oppo(node * head1, node * head2)//求对称差 { node* head3 = NULL, * head4 = NULL, * head5 = NULL, * p1 = NULL, * New_tail = NULL; head4 = Plus(head1, head2); head3 = Cross(head1, head2); while (head4 != NULL) { if (IN_SET(head3, head4))//如果head3与head4链表中的元素不相同,执行 { node* p1 = (node*)malloc(sizeof(p1)); p1->next = NULL; (p1->data) = (head4->data);//把不相同的元素取出,组成新的链表 if (head5 == NULL) { head5 = p1; New_tail = p1; } else { New_tail->next = p1; New_tail = p1; } } head4 = head4->next; } return head5; } int lenth(node * head)//计算链表长度的函数 { node* temp = head; int i = 0; while (temp != NULL) { i++; temp = (temp->next); } return i; } ```
求求。怎么在里面插入拓补排序。
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; int n = 0; int a[100][100]; int menu() { int m; printf(" 求最小生成树\n"); printf(" ________________________________\n\n"); printf(" 1 输入城市之间的信息\n"); printf(" 2 判断是否能构成一个最小生成树\n"); printf(" 3 查询信息\n"); printf(" 4 退出\n"); printf(" ________________________________\n\n"); printf(" 请输入所选功能1--4\n"); scanf("%d",&m); return m; } void xin_input() { printf("1 遍历所有城市的最小生成树\n"); printf("2 查询两个城市之间的距离\n"); printf("3 退出\n"); //printf("________________________________\n\n"); } //以下为克鲁斯卡尔算法 typedef struct node //构造一个结构体,两个城市可以看成起点和终点,之间的路道可以看成一个边 { int st; //起点 int ed; //终点 int dis;//距离 }node; node p[1000]; int pre[1000],rank[1000]; bool cmp(node p1,node p2) { return p1.dis < p2.dis; } //下面三个函数是并查集,其作用是检验当一条边添加进去,是否会产生回路 void set(int x) { pre[x] = x;//初始化 rank[x] = 0; } int find(int x)//找到这个点的祖先 { if(x != pre[x]) pre[x] = find(pre[x]); return pre[x]; } void Union(int x,int y)//将这两个添加到一个集合里去 { x = find(x); y = find(y); if(rank[x] >= rank[y]) { pre[y] = x; rank[x] ++; } else pre[y] = x; } void Kruskal() // { int ans = 0,i,j,k = 0; for(i = 1;i <= n;i ++) set(i); for(i = 1;i <= n;i ++) for(j = i + 1;j <= n;j ++) { p[++k].st = i; p[k].ed = j; p[k].dis = a[i][j]; //先把所有城市之间的路段看成一个边 } sort(p + 1,p + k + 1,cmp);//把所有的边按从小到大进行排序 int count = 0; for(i = 1;i <= k;i ++) { if(find(p[i].st) != find(p[i].ed))//如果这两点连接在一起不构成一个回路,则执行下面操作 { printf("第%d条路段为:%d--%d,权值为%d\n",++ count,p[i].st,p[i].ed,p[i].dis);//将这条边的起点、终点打印出来 ans += p[i].dis; //说明这条路段要用 Union(p[i].st,p[i].ed); } } printf("遍历所有城市的最短路程为: %d\n",ans);//最短遍历的路程 //printf("________________________________\n"); } //普里姆算法 int prim() { int close[100],low[100],i,j,ans = 0;//close[j]表示离j最近的顶点,low[j]表示离j最短的距离 bool use[100]; use[1] = 1; for(i = 2;i <= n;i ++) { low[i] = a[1][i]; //初始化 close[i] = 1; use[i] = 0; } for(i = 1;i < n;i ++) { int min = 100000000,k = 0; for(j = 2;j <= n;j ++) { if(use[j] == 0 && min > low[j])//找到最小的low[]值,并记录 { min = low[j]; k = j; } } //printf("%d %d\n",close[k],k); for(j = 2;j <= n;j ++) { if(use[j] == 0 && low[j] > a[k][j]) { low[j] = a[k][j]; //修改low[]值和close[]值 close[j] = k; } } ans += a[close[k]][k]; } return ans; } //求最短路径-单源点到其余点的最短路径(Dijkstra算法) void ShortestPath_DIJ(int x,int y) //X指单源点,y指目标点 { int i,d[100],j; bool use[100]; for(i = 1;i <= n;i ++) { use[i] = 0; //初始化 d[i] = a[x][i]; } use[x] = 1;//这个点肯定用过 d[x] = 0; for(i = 1;i < n;i ++)//执行n-1次操作 { int min = 100000000,v; for(j = 1;j <= n;j ++) { if(use[j] == 0 && min > d[j])//找出最短距离的 { min = d[j]; v = j; } } use[v] = 1; for(j = 1;j <= n;j ++) { if(use[j] == 0 && d[j] > min + a[v][j])//修改d[]的值 { d[j] = min + a[v][j]; } } } printf("%d城市到城市%d的最短距离为: %d\n",x,y,d[y]); } //求每一对顶点之间的最短路径(Floyd算法) int b[100][100]; void ShortestPath_FLOYD() //这个算法耗时多(n^3),不过容易理解 { int i,j,k; for(i = 1;i <= n;i ++) for(j = 1;j <= n;j ++) b[i][j] = a[i][j]; //先b[][]进行保存,避免a[][]的值发生变化 for(k = 1;k <= n;k ++) for(i = 1;i <= n;i ++) for(j = 1;j <= n;j ++) if(b[i][j] > b[i][k] + b[k][j]) b[i][j] = b[i][k] + b[k][j]; while(1) { int st,ed; printf("请输入两个城市的编号:\n");//对此进行多次操作 scanf("%d%d",&st,&ed); printf("%d 城市到 %d 城市的最短距离为: %d\n",st,ed,b[st][ed]); //printf("________________________________\n"); char str[100]; printf("是否要继续? yes or no\n"); scanf("%s",str); if(strcmp(str,"no") == 0) { //printf("________________________________\n"); break; } } } void shuru()//输入城市信息 { int i,j; if(n != 0) { char str[100]; printf("是否要确定输入新的城市之间的信息? yes or no ?\n"); scanf("%s",str); if(strcmp(str,"no") == 0) { return ; } } printf("请输入城市的个数:\n"); scanf("%d",&n); printf("输入%d个城市的邻接矩阵:\n",n); for(i = 1;i <= n;i ++) { for(j = 1;j <= n;j ++) scanf("%d",&a[i][j]); } //printf("________________________________\n"); } void chaxun() //一个查徇两个城市最短径的操作 { while(1) { int t1,t2; printf("输入第一个城市的编号:\n"); scanf("%d",&t1); printf("输入第二个城市的编号:\n"); scanf("%d",&t2); ShortestPath_DIJ(t1,t2);//调用 char str[100]; printf("是否要继续? yes or no\n"); scanf("%s",str); if(strcmp(str,"no") == 0) { //printf("________________________________\n"); break; } } } void chaxun_func() { if(n == 0) { printf("这里没有城市之间的信息\n"); return; } xin_input(); printf("请选择以上功能:1-3\n"); int m1; scanf("%d",&m1); printf("\n"); if(m1 == 1) Kruskal(); else if(m1 == 2) { chaxun(); } //else // break; } void judge() { int ans; ans = prim(); if(ans >= 100000000) printf("不能构成最小生成树\n"); else printf("能构成最小生成树\n"); } int main() { while(1) { switch(menu()) { case 1:shuru();break; case 2:judge();break; case 3: chaxun_func();break; case 4:goto loop; } } loop:; return 0; }
新手在学Java,求教下面利用集合编写斗地主的代码错在哪里了?万分感谢!
import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Random; import java.util.Set; //    张三,李四,王五三个人打斗地主,三人约定,洗牌后, //    随机抽取一张"明牌"并夹在中间;然后依次抓牌,谁抓到这张便自动作为地主,并收取最后三张。 //    要求:请用程序实现这一过程,最后打印地主名,以及三个人的牌(要求排序); //    思路: //        1.定义一个Map集合存储一副扑克牌;List存储编号; //        2.洗牌; //        3.随机抽取一个索引(该值必须在倒数三张之前),用于表示"明牌",在发牌 //        时谁抓到这一张便作为"地主"; //        4.依次给三个人(张三,李四,王五)发牌,并监督谁作为地主;地主自动收取最后三张。 //      5.打印地主名; //      6.最后以排序后的方式打印每个人手里的牌 public class Demo03 {     public static void main(String[] args) {         HashMap<Integer, String> map = new HashMap<Integer, String>();         // 花色         ArrayList<String> flower = new ArrayList<String>();         Collections.addAll(flower, "♣", "♦", "♠", "♥");         // 数字         ArrayList<String> number = new ArrayList<String>();         Collections.addAll(number, "3", "4", "5", "6", "7", "8", "10", "J", "Q", "K", "A", "2");         Integer a = 1;         for (String number1 : number) {             for (String flower1 : flower) {                 String s = flower1 + number1;                 map.put(a++, s);             }         }         map.put(53, "小☆");         map.put(54, "大★");         System.out.println(map);         Set<Integer> keySet = map.keySet();         ArrayList<Integer> list = new ArrayList<Integer>();         for (Integer integer : keySet) {             list.add(integer);         }         System.out.println(list);         Collections.shuffle(list);         System.out.println(list);         ArrayList<Integer> p1 = new ArrayList<Integer>();         ArrayList<Integer> p2 = new ArrayList<Integer>();         ArrayList<Integer> p3 = new ArrayList<Integer>();         ArrayList<Integer> p0 = new ArrayList<Integer>();         System.out.println(list.size());         for (int i = 0; i < list.size(); i++) {             if (i >= 51) {                 p0.add(list.get(i));             } else {                 if (i % 3 == 0) {                     p1.add(list.get(i));                 } else if (i % 3 == 1) {                     p2.add(list.get(i));                 } else if (i % 3 == 2) {                     p3.add(list.get(i));                 }             }         }         System.out.println(p1);         System.out.println(p2);         System.out.println(p3);         System.out.println(p0);         Random r = new Random();         Integer dz = null;         while ((p0.contains(dz)) ){             dz = r.nextInt(54) + 1;                      }                  dz(p1, dz, p0);         dz(p2, dz, p0);         dz(p3, dz, p0);         ArrayList<String> player1 = new ArrayList<String>();         ArrayList<String> player2 = new ArrayList<String>();         ArrayList<String> player3 = new ArrayList<String>();         for (Integer integer : p1) {             player1.add(map.get(integer));         }         for (Integer integer : p2) {             player2.add(map.get(integer));         }         for (Integer integer : p3) {             player3.add(map.get(integer));         }         System.out.println("张三=" + player1);         System.out.println("李四=" + player2);         System.out.println("王五=" + player3);     }     public static void dz(ArrayList<Integer> p, Integer dz, ArrayList<Integer> p0) {         System.out.println("试试");         int count = -1;         for (int i = 0; i < p.size(); i++) {             if (dz.equals(p.get(i))) {                 count = i;             }                      }         if (count != -1) {             for (int j = 0; j < p0.size(); j++) {                 System.out.println("试试1");                 p.add(p0.get(j));                 System.out.println(p + "");             }         }         if (count == -1) {             return;         }     } }
这段代码不知道怎么改,总是改不出来,希望各位帮忙看看
#include <vector> #include <map> #include <deque> #include <iostream> using namespace std; // 用于存储图的节点及其相邻节点的结构体变量类型 struct SGNode { int key; // 结点自身标识 map<int, float> neighNodes; // 与当前结点相邻的结点集合,及其与相邻结点之间路径的权值 }; // 用于存储边的结构体变量类型 struct SGEdge { int start; int end; }; // 用于存储边及其权重的map容器(注意:会按照权重自小而大自动排序) typedef map<float, SGEdge> EdgeSet; class CMyGraph { public: CMyGraph(void); ~CMyGraph(void); public: // 其他函数,供实例调用 void DFS(); void DFS(int i, vector<int>& mystack, bool* visited); void BFS(); void BFS(int i, deque<int>& mydeque, bool* visited); void Prim(); void Kruskal(); protected: // 属性变量 /* 自行设计完成 */ private: // 成员变量 vector<SGNode> NodeSet; }; CMyGraph::CMyGraph(void) { float g[8][8] = { {0, 12, 1, 0, 0, 0, 0, 4}, {12, 0, 0, 11, 0, 10, 0, 0}, {1, 0, 0, 9, 2, 0, 0, 0}, {0, 11, 9, 0, 0, 0, 8, 0}, {0, 0, 2, 0, 0, 0, 5, 3}, {0, 10, 0, 0, 0, 0, 7, 6}, {0, 0, 0, 8, 5, 7, 0, 0}, {4, 0, 0, 0, 3, 6, 0, 0} }; for (int i = 0; i < 8; i++) { SGNode sg; sg.key = i; NodeSet.push_back(sg); } for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (g[i][j] != 0) { NodeSet[i].neighNodes.insert(map<int, float>::value_type(j, g[i][j])); } } } vector<SGNode>::iterator iter; for (iter = NodeSet.begin(); iter != NodeSet.end(); iter++) { cout << (*iter).key; map<int, float>::iterator iter2; for (iter2 = (*iter).neighNodes.begin(); iter2 != (*iter).neighNodes.end(); iter2++) { cout << ", (" << (*iter2).first << ", " << (*iter2).second << ")"; } cout << endl; } } CMyGraph::~CMyGraph(void) { } void CMyGraph::DFS() { bool *visited; visited = new bool[8]; for (int i = 0; i < 8; i++) visited[i] = false; vector<int> mystack; DFS(0, mystack, visited); } void CMyGraph::DFS(int i, vector<int>& mystack, bool * visited) { if (i >= 0 && i < NodeSet.size()) { if (!visited[i]) { cout << i << "\n"; mystack.push_back(i); visited[i] = true; } map<int, float>::iterator iter; for (iter = NodeSet[i].neighNodes.begin(); iter != NodeSet[i].neighNodes.end(); iter++) { if (!visited[(*iter).first]) DFS((*iter).first, mystack, visited); } if (iter == NodeSet[i].neighNodes.end()) { if (mystack.size() > 0) { mystack.pop_back(); if (mystack.size() > 0) DFS(mystack.at(mystack.size() - 1), mystack, visited); } } } } void CMyGraph::BFS() { bool *visited; visited = new bool[8]; for (int i = 0; i < 8; i++) visited[i] = false; deque<int> mydeque; BFS(0, mydeque, visited); } void CMyGraph::BFS(int i, deque<int>& mydeque, bool* visited) { if (!visited[i]) { cout << i << "\n"; for (map<int, float>::iterator iter = NodeSet[i].neighNodes.begin(); iter != NodeSet[i].neighNodes.end(); iter++) { if (!visited[(*iter).first]) mydeque.push_back((*iter).first); } visited[i] = true; } while (mydeque.size() > 0) { int i = mydeque.at(0); mydeque.pop_front(); BFS(i, mydeque, visited); } } void CMyGraph::Prim() { // 选择图中的任一顶点作为起点 int start = 0; int s1; set<int> mtSet; mtSet.insert(start); // 选择初始节点 float weight; while (1) { weight = 100000.0f; // 人为设定较大值 start = -1; s1 = -1; for (set<int>::iterator iter = mtSet.begin(); iter != mtSet.end(); iter++) { map<int, float>::iterator curIter = NodeSet[(*iter)].neighNodes.begin(); while (curIter != NodeSet[(*iter)].neighNodes.end()) { // 当前节点已经在集合中 if ( mtSet.end() != ( mtSet.find( (*curIter).first ) ) ) { curIter++; continue; } // 当前节点不在集合中,记录该节点并作为备选节点 if ((*curIter).second < weight) // 选择权重最小的边所边接的节点 { s1 = (*iter); start = (*curIter).first; weight = (*curIter).second; } curIter++; } } if (-1 != start) { // 从备选边与节点加入到最小生成树中 mtSet.insert(start); cout << "(" << s1 << ", " << start << ") " << endl; if (mtSet.size() == NodeSet.size()) break; } } } void CMyGraph::Kruskal() { // 对所有边进行排序 EdgeSet es; for (int i = 0; i < NodeSet.size(); i++) { for (map<int, float>::iterator iter = NodeSet[i].neighNodes.begin(); iter != NodeSet[i].neighNodes.end(); iter++) { if ((*iter).second != 0.0f) { SGEdge sg; sg.start = i; sg.end = (*iter).first; es.insert(EdgeSet::value_type( (*iter).second, sg)); } } } set<int> mtSet; // 依次加入权重最小的边(数目:顶点数-1) EdgeSet::iterator iter = es.begin(); for (int i = 0; i < NodeSet.size() - 1;) { // 初始最小生成树为空的情况 if (mtSet.size() == 0) { cout << "(" << (*iter).second.start; cout << ", "; cout << (*iter).second.end << ")" << endl; mtSet.insert((*iter).second.start); mtSet.insert((*iter).second.end); iter++; i++; continue; } // 待加入边的两个端点位于两个不同的子图中 if ((mtSet.find((*iter).second.start) == mtSet.end() && mtSet.find((*iter).second.end) != mtSet.end()) || (mtSet.find((*iter).second.start) != mtSet.end() && mtSet.find((*iter).second.end) == mtSet.end())) { cout << "(" << (*iter).second.start; cout << ", "; cout << (*iter).second.end << ")" << endl; mtSet.insert((*iter).second.start); mtSet.insert((*iter).second.end); iter++; i++; } else { iter++; } } } int main() { CMyGraph mg; cout << "Depth first scanning:" << endl; mg.DFS(); cout << "Breadth first scanning:" << endl; mg.BFS(); cout << "Prim:\n"; mg.Prim(); cout << "Kruskal:\n"; mg.Kruskal(); return 0; }
python 新手python小问题
第73行的print(classcount) 为什么运行以后 命令行无显示![图片说明](https://img-ask.csdn.net/upload/201804/17/1523976324_975204.png) ``` from math import log import operator def calcShannonEnt(dataSet): numEntires = len(dataSet) #返回数据集的行数 labelCounts = {} #保存每个标签(Label)出现次数的字典 for featVec in dataSet: #对每组特征向量进行统计 currentLabel = featVec[-1] #提取标签(Label)信息 if currentLabel not in labelCounts.keys(): #如果标签(Label)没有放入统计次数的字典,添加进去 labelCounts[currentLabel] = 0 labelCounts[currentLabel] += 1 #Label计数 shannonEnt = 0.0 #经验熵(香农熵) for key in labelCounts: #计算香农熵 prob = float(labelCounts[key]) / numEntires #选择该标签(Label)的概率 shannonEnt -= prob * log(prob, 2) #利用公式计算 return shannonEnt #返回经验熵(香农熵) def createDataSet(): dataSet = [[0, 0, 0, 0, 'no'], #数据集 [0, 0, 0, 1, 'no'], [0, 1, 0, 1, 'yes'], [0, 1, 1, 0, 'yes'], [0, 0, 0, 0, 'no'], [1, 0, 0, 0, 'no'], [1, 0, 0, 1, 'no'], [1, 1, 1, 1, 'yes'], [1, 0, 1, 2, 'yes'], [1, 0, 1, 2, 'yes'], [2, 0, 1, 2, 'yes'], [2, 0, 1, 1, 'yes'], [2, 1, 0, 1, 'yes'], [2, 1, 0, 2, 'yes'], [2, 0, 0, 0, 'no']] labels = ['年龄', '有工作', '有自己的房子', '信贷情况'] #特征标签 return dataSet, labels #返回数据集和分类属性 def splitDataSet(dataSet, axis, value): retDataSet = [] #创建返回的数据集列表 for featVec in dataSet: #遍历数据集 if featVec[axis] == value: reducedFeatVec = featVec[:axis] #去掉axis特征 reducedFeatVec.extend(featVec[axis+1:]) #将符合条件的添加到返回的数据集 retDataSet.append(reducedFeatVec) return retDataSet #返回划分后的数据集 def chooseBestFeatureToSplit(dataSet): numFeatures = len(dataSet[0]) - 1 #特征数量 baseEntropy = calcShannonEnt(dataSet) #计算数据集的香农熵 bestInfoGain = 0.0 #信息增益 bestFeature = -1 #最优特征的索引值 for i in range(numFeatures): #遍历所有特征 #获取dataSet的第i个所有特征 featList = [example[i] for example in dataSet] uniqueVals = set(featList) #创建set集合{},元素不可重复 newEntropy = 0.0 #经验条件熵 for value in uniqueVals: #计算信息增益 subDataSet = splitDataSet(dataSet, i, value) #subDataSet划分后的子集 prob = len(subDataSet) / float(len(dataSet)) #计算子集的概率 newEntropy += prob * calcShannonEnt(subDataSet) #根据公式计算经验条件熵 infoGain = baseEntropy - newEntropy #信息增益 if (infoGain > bestInfoGain): #计算信息增益 bestInfoGain = infoGain #更新信息增益,找到最大的信息增益 bestFeature = i #记录信息增益最大的特征的索引值 return bestFeature #返回信息增益最大的特征的索引值 def majorityCnt(classList): classCount = {} for vote in classList: #统计classList中每个元素出现的次数 if vote not in classCount.keys(): classCount[vote] = 0 classCount[vote] += 1 print(clsssCount) sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True) #根据字典的值降序排序 return sortedClassCount[0][0] #返回classList中出现次数最多的元素 def createTree(dataSet, labels, featLabels): classList = [example[-1] for example in dataSet] if classList.count(classList[0]) == len(classList): #如果类别完全相同则停止继续划分 return classList[0] if len(dataSet[0]) == 1: #遍历完所有特征时返回出现次数最多的类标签 return majorityCnt(classList) bestFeat = chooseBestFeatureToSplit(dataSet) #选择最优特征 bestFeatLabel = labels[bestFeat] #最优特征的标签 featLabels.append(bestFeatLabel) myTree = {bestFeatLabel:{}} #根据最优特征的标签生成树 del(labels[bestFeat]) featValues = [example[bestFeat] for example in dataSet] #得到训练集中所有最优特征的属性值 uniqueVals = set(featValues) #去掉重复的属性值 for value in uniqueVals: #遍历特征,创建决策树。 myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), labels, featLabels) return myTree if __name__ == '__main__': dataSet, labels = createDataSet() featLabels = [] myTree = createTree(dataSet, labels, featLabels) ```
我这个只能捕获InputMismatchException异常,要想抛出该异常怎么写。
package lwz; import java.util.*; public class Employment { public static void main(String[] args) throws java.util.InputMismatchException{ // 创建EmpManage对象 EmpManage em = new EmpManage(); Scanner sr = new Scanner(System.in); // 作出一个菜单 while (true) { System.out.println("公司职员薪水管理系统"); System.out.println("1、录入新员工"); System.out.println("2、根据工号查询信息"); System.out.println("3、查询所有员工信息"); System.out.println("4、通过工号修改员工薪水"); System.out.println("5、删除员工信息"); System.out.println("6、按薪水高低排序"); System.out.println("7、计算平均工资及最高(低)工资"); System.out.println("0、退出系统"); System.out.print("请输入对应的数字进行操作:"); int sel = sr.nextInt(); switch (sel) { case 1: System.out.println("请录入新员工的信息"); try { System.out.print("工号(输入-1返回到上一级菜单中):"); String empNo = sr.next(); if (empNo.equals("-1")) { break; } System.out.print("姓名:"); String name = sr.next(); System.out.print("工资:"); float sal = sr.nextFloat(); // 构建emp对象 Emp emp = new Emp(empNo, name, sal); // 将empNo,name,sal的值传给构造函数Emp em.addEmp(emp); System.out.println("创建新员工" + name + "成功!"); } catch (InputMismatchException e) { System.out.println("请输入正确格式的工号、姓名和工资" + "\n工号必须为字符串形式" + "\n姓名必须为字符串形式" + "\n工资必须为数字类型"); } break; case 2: System.out.println("请录入员工工号:"); String empNo1 = sr.next(); em.showInfo(empNo1); break; case 3: System.out.println("公司所有员工信息如下:"); em.AllInfo(); break; case 4: System.out.println("请输入工号:"); String empNo2 = sr.next(); System.out.println("将工资修改为:"); float newSal = sr.nextFloat(); em.updateSal(empNo2, newSal); break; case 5: System.out.println("请输入要删除人员的工号:"); String empNo3 = sr.next(); em.delEmp(empNo3); break; case 6: System.out.println("已按薪资高低进行排序如下:"); em.SortSal(); break; case 7: System.out.println("显示平均工资及最高、最低工资人员信息如下:"); em.Average(); break; case 0: System.out.println("已正常退出!"); System.exit(0); break; default: System.out.println("输入错误,请重新输入!"); } } } } // 创建员工管理类 class EmpManage { private ArrayList<Emp> al = new ArrayList<Emp>(); // 加入员工 public void addEmp(Emp emp) {// 传入员工信息 al.add(emp); } // 根据员工工号显示员工的相关信息 public void showInfo(String empNo) {// 将工号传入showInfo方法中 // 遍历整个ArrayList for (int i = 0; i < al.size(); i++) { // 取出Emp对象 Emp emp = al.get(i); // 比较编号 if (emp.getEmpNo().equals(empNo)) {// 由于empNo类型为String,所以要使用equals进行内容比较,不可以使用==地址比较 System.out.println("找到该员工,他的信息是:"); System.out.println("工号:" + empNo + "\t姓号:" + emp.getName() + "\t薪水:" + emp.getSal()); } } System.out.println("工号不存在或者无此人,无法进行相关操作!"); } // 显示所有员工信息 public void AllInfo() { for (int i = 0; i < al.size() - 1; i++) {// ArrayList集合类的al大小,控制循环 for (int j = 1; j < al.size() - i; j++) {// 将al中的值进行循环比较 Emp emp1 = (Emp) al.get(j - 1); Emp emp2 = (Emp) al.get(j); // 使用compareTo方法进行Sting类型值比较 if (emp1.getEmpNo().compareTo(emp2.getEmpNo()) > 0) { al.set(j, emp1);// 交换值并重写入al中 al.set(j - 1, emp2);// 交换值并重写入al中 } } } for (Emp emp : al) { System.out.println("工号:" + emp.getEmpNo() + "\t姓名:" + emp.getName() + "\t工资:" + emp.getSal()); } } // 修改员工的薪水 public void updateSal(String empNo, float newSal) { // 遍历整个ArrayList for (int i = 0; i < al.size(); i++) { // 取出Emp对象 Emp emp = (Emp) al.get(i); if (emp.getEmpNo().equals(empNo)) { // 修改新水 emp.setSal(newSal);// setSal会将修改的薪水传和ArrayList中 System.out.println("已将" + emp.getName() + "调整为:" + newSal); } } System.out.println("工号不存在或无此人,无法进行相应操作!"); } // 员工离职删除指定员工 public void delEmp(String empNo) { // 遍历整个ArrayList for (int i = 0; i < al.size(); i++) { // 取出Emp对象 Emp emp = (Emp) al.get(i); if (emp.getEmpNo().equals(empNo)) { // 按工号删除 al.remove(i);// 也可以使用al.remove(emp); System.out.println("已将" + emp.getName() + "信息清除!"); } } } // 按薪水高低排序 public void SortSal() { for (int i = 0; i < al.size() - 1; i++) {// ArrayList集合类的al大小,控制循环 for (int j = 1; j < al.size() - i; j++) {// 将al中的值进行循环比较 Emp emp1 = (Emp) al.get(j - 1); Emp emp2 = (Emp) al.get(j); if (emp1.getSal() < emp2.getSal()) {// 比较sal的值大小 al.set(j, emp1);// 交换值并重写入al中 al.set(j - 1, emp2);// 交换值并重写入al中 } } } for (Emp emp : al) { System.out.println("工号:" + emp.getEmpNo() + "\t姓名:" + emp.getName() + "\t工资:" + emp.getSal()); } } // 计算平均工资并找出最高工资和最低工资的员工 public void Average() { float sum = 0f, ave = 0f; // 遍历整个ArrayList for (int k = 0; k < al.size(); k++) { // 取出Emp对象 Emp emp = (Emp) al.get(k); sum = emp.getSal() + sum; } ave = sum / al.size(); System.out.println("共有员工" + al.size() + "人\t总工资为:" + sum + "\t平均工资为:" + ave); // 找出最高工资与最低式资 for (int i = 0; i < al.size() - 1; i++) {// ArrayList集合类的al大小,控制循环 for (int j = 1; j < al.size() - i; j++) {// 将al中的值进行循环比较 Emp emp1 = (Emp) al.get(j - 1); Emp emp2 = (Emp) al.get(j); if (emp1.getSal() < emp2.getSal()) {// 比较sal的值大小 al.set(j, emp1);// 交换值并重写入al中 al.set(j - 1, emp2);// 交换值并重写入al中 } } } for (int i = 0; i < al.size(); i++) { if (i == 0) { Emp emp = (Emp) al.get(i); System.out.println("工资最高的人员是:" + emp.getName() + "\t薪水是:" + emp.getSal()); } else if (i == al.size() - 1) { Emp emp = (Emp) al.get(i); System.out.println("工资最低的人员是:" + emp.getName() + "\t薪水是:" + emp.getSal()); } } } } // 创建员工类 class Emp { // 定义成员变量工号、姓名、薪水 public String empNo; public String name; public float sal; // 创建构造函数,初始化成员变量 public Emp(String empNo, String name, float sal) { this.empNo = empNo; this.name = name; this.sal = sal; } // 使用set、get方法进行数据传递 public String getEmpNo() { return empNo; } public void setEmpNo(String empNo) { this.empNo = empNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getSal() { return sal; } public void setSal(float sal) { this.sal = sal; } }
从onReceive 方法中设置新的报警器
在数据库(按时间排序)中有一个 reminders 的集合,当程序开启时我就调用 setAlarm。我需要在 onReceive 方法中添加代码来实现下面的任务: 1.从数据库中获取第一个提醒。 2.获得相关提醒的延迟。 3.设置一个新的报警获得下一个提醒。 我创建的 BroadcastReceiver 类: public class AlarmReceiver extends BroadcastReceiver{ private static final String DEBUG_TAG= "AlarmReceiver"; public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub Log.d(DEBUG_TAG,"ALARM!!!"); // --mycode-- } } Activity 类: public class AlarmActivity extends Activity { private Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); context = getApplicationContext(); } public void setAlarm(View v){ Intent intent = new Intent(this,AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ Delay,pendingIntent); Log.i("SETTER","Alarm started"); } public void stopAlarm(View v){ Intent intent = new Intent(this,AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); pendingIntent.cancel(); } } 现在在 --mycode— 这部分,新的延迟将会从数据库中获得,并且会使用这个新的Delay设置新的报警。 如何从 onReceive方法中设置一个新的 AlarmManager?
struts2留言显示问题,头疼好几天了。
项目中用s2sh做的用户留言功能。用户登录时根据uid获取给自己的留言信息放入map中(struts2的session)并在前台遍历显示,没有问题,现在我需要将来访者新的留言顺序显示在所有留言的上面,封装好留言对象后用dao保存到数据库中,并将留言对象放入map中,返回前台显示,这是可以显示,但新增第二条留言时,会覆盖之前的一条留言。怎么解决啊,头疼死了,帮帮忙吧。<br /><strong>问题补充:</strong><br />数据库中保存正常,是在显示的时候覆盖了,再有我也觉得放入session不好,会占用过多内存但该怎么做呢?<br /><strong>问题补充:</strong><br />不光是留言显示的问题,还有比如添加好友后的显示好友列表这样类似的问题,其实我就是搞不清楚应该怎么保存此类信息并在前台顺序显示。eyeqq 能说详细些吗?谢谢!<br /><strong>问题补充:</strong><br />没有写equals和hashCode,这两个方法有什么用? <br /><br /><strong>问题补充:</strong><br />用了request 但新增留言显示在最后,需页面刷新后才能显示在留言列表的最上面 <br />现在我是这样做的: <br />第一步:  点击好友的链接显示好友的个人主页,此时留言列表可以正常显示,步骤如下: <br />     a:点击好友链接后提交personpage.action处理(主要是获取好友对象,根据好友对象得到好友的所有留言放入request) 代码: <br /> <br />personpage.action <br /> <br />public class PersonPageAction extends ActionSupport { <br /> private static final long serialVersionUID = 1L; <br /> private String personuid; <br /> private UserBusiness userBusiness; <br /> <br /> public void setUserBusiness(UserBusiness userBusiness) { <br /> this.userBusiness = userBusiness; <br /> } <br /> public String getPersonuid() { <br /> return personuid; <br /> } <br /> public void setPersonuid(String personuid) { <br /> this.personuid = personuid; <br /> } <br /> @Override <br /> public String execute() throws Exception { <br /> if(userBusiness.isGetUser(personuid)) { <br /> return SUCCESS; <br /> } <br /> return INPUT; <br /> } <br />} <br /> <br />UserBusiness的代码: <br /> <br />public boolean isGetUser(String personuid) { <br /> try { <br /> <br /> //首先获取当前user对象 <br />User personuser = getUser(Integer.valueOf(personuid)); <br /> <br />HttpServletRequest request = ServletActionContext.getRequest(); <br /> <br />request.setAttribute("personfriendusers", personfriendusers); <br />request.setAttribute("personuser", personuser); <br />request.setAttribute("personguestbooks", personuser.getGuestbooks()); <br /> return true; <br /> } catch (Exception e) { <br /> e.printStackTrace(); <br /> return false; <br /> } <br /> <br /> <br />b:好友个人主页jsp的留言显示代码: <br /> <br />//留言代码: <br />    &lt;form action="guestbook.action"&gt;    &lt;textarea name="gcontent" rows="3" cols="53"&gt; <br />    <br /> <br />    &lt;input name="personuserid" type="hidden" value="&amp;amp;lt;s:property value="&gt;"/&gt; <br />   &lt;input type="submit" value="留言"&gt; <br />   <br />    &lt;/form&gt; <br /> <br />//留言显示代码 <br /> <br />&lt;s:iterator value="#request.personguestbooks" status="stuts"&gt; <br /> <div> <br /> <br /> 姓名:&lt;s:property value="gname"&gt; <br /> 时间:&lt;s:property value="gtime"&gt; <br /> 内容:&lt;s:property value="gcontent"&gt; <br />        </div> <br /> &lt;/s:iterator&gt; <br /> <br />第二步:新添加留言:在上面个人主页上添加留言内容提交到guestbook.action(增加新留言到数据库,并且在返回到个人主页显示) <br /> <br />guestbook.action代码: <br /> <br />public class GuestbookAction extends ActionSupport { <br /> <br />@Override <br />public String execute() throws Exception { <br /> <br />if(guestbookBusiness.isGuestbookAdd(personuserid,gcontent)) { <br />HttpServletRequest request = ServletActionContext.getRequest(); <br />User personuser = (User)request.getAttribute("personuser"); <br />request.setAttribute("personguestbooks", personuser.getGuestbooks()); <br /> return SUCCESS; <br /> } <br /> return INPUT; <br /> } <br /> <br />GuestbookBusiness代码如下: <br /> <br />public class GuestbookBusinessImpl implements GuestbookBusiness { <br /> <br /> <br />public boolean isGuestbookAdd(Integer personuserid,String gcontent) { <br /> <br />try { <br />User personuser = userDao.get(personuserid); <br />User user = (User)ActionContext.getContext().getSession().get("user"); <br /> guestbook.setGcontent(gcontent); <br /> guestbook.setGtime(new Date()); <br /> guestbook.setGname(user.getUsername()); <br /> guestbook.setUser(personuser); <br /> //将留言对象加入用户留言集合 <br /> personuser.getGuestbooks().add(guestbook); <br /> guestbookDao.addGuestbook(guestbook); <br />HttpServletRequest request = ServletActionContext.getRequest(); <br /> //返回到Action <br /> equest.setAttribute("personuser", personuser); <br /> return true; <br /> } catch (Exception e) { <br /> e.printStackTrace(); <br /> } <br /> return false; <br /> } <br /> <br />此时返回的新增留言在最后,需刷新才能提前,这样写是不是有问题,该怎样做才能直接将回复的留言显示在留言列表的最上面呢?<br /><strong>问题补充:</strong><br />你的personuser.guestbooks是个Set还是个List? <br />guestbook.action中success到哪里了? <br /> <br />用的是Set      success后直接回person.jsp 页面 <br /> <br />"重定向"   我去试一下 struts2好像是在struts2好像是在struts.xml配置 <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /><br /><strong>问题补充:</strong><br />你好eyeqq  我去做了重定向 又有一个新问题: 从url看重定向成功,但重定向后person.jsp页面取不到request的值,不光留言的内容,其他request中的的值也取不到,但点击其他页面后再点击好友链接新加入的留言显示出来并且正常排序。(好友与留言用hibernate做的一对多关联映射,排序是按gid逆向排序,没有按时间排序)怎么回事呢?<br /><strong>问题补充:</strong><br />首先谢谢你,还有加分是肯定的了,10分都给你,虽然还没有解决我的问题,但已经给了我很多好的建议。我在做一下重定向action 去数据库重新取一下,分先给了。。
做了一个小时的面试题(没有过 希望大家帮忙答下 虽然很幼稚 毕竟每个人都是这么过来的吗 感激了!)
XX软件工程师笔试试题 注:1、请参考人员将答案写在答题纸上,勿将答案写在此卷上。 2、请参考人员将编号与姓名填写在答题纸上。 1、 以下数据结构中不属于线性数据结构的是()。 A、队列 B、线性表 C、二叉树 D、栈 我的答案:C 2、 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是()。 A、 可行性分析 B、需求分析 C、详细设计 D、程序编码 我的答案:B 3、 结构化程序设计主要强调的是()。 A、 程序的规模 B、程序的易读性 C、程序的执行效率 D、程序的可移植性 我的答案:C 4、 在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段()。 A、 概要设计 B、详细设计 C、可行性分析 D、需求分析 我的答案:B 5、 下列关于栈的叙述中正确的是()。 A、 在栈中只能插入数据 B、在栈中只能删除数据 B、 栈是先进先出的线性表 D、栈是先进后出的线性表 我的答案:D 6、 下面不属于软件设计原则的是()。 A、 抽象 B、模块化 C、自底向上 D、信息隐蔽 我的答案:C 7、 对长度为N的线性表进行顺序查找,在最坏情况下所需要的比较次数为()。 A、 N+1 B、N C、(N+1)/2 D、N/2 我的答案:C 8、 视图设计一般有3种设计次序,下列不属于视图设计的是()。 A、 自顶向下 B、由外向内 C、由内向外 D、自底向上 我的答案:C 9、下列有关数据库的描述,正确的是()。 A、数据库是一个DBF文件 B、数据库是一个关系 C、数据库是一个结构化的数据集合 D、数据库是一组文件 我的答案:C 10、下列说法中,不属于数据模型所描述的内容的是()。 A、数据结构 B、数据操作 C、数据查询 D、数据约束 我的答案:A 11、若按功能划分,软件测试的方法通常分为白盒测试方法和(黑盒测试方法)。 12、数据库系统的三级模式分别为(级联)模式、内部级模式与外部级模式。 13、在最坏情况下,冒泡排序的时间复杂度为(N+1/2)。 14、在面向对象方法中,信息隐蔽是通过对象的(封装)性来实现的。 15、关系模型的数据操纵既是建立在关系上的数据操纵,一般有(插入)、增加、删除、和修改四种操作。 16、TIME()的返回值的数据类型是(String)类型。 17、编写SQL语句 1)、创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话 我的答案: create table student( studentCardNo number(2) primary key, name char(10), age number(2), sex char(2) check(sex in (‘男’,’女’)), address varchar2(100), tel number(2) ) 2)、修改学生表的结构,添加一列信息,学历 我的答案: alter table student add(xueli varchar2(20)); 3)、修改学生表的结构,删除一列信息,家庭住址 我的答案: alter table student drop column address; 4)、向学生表添加如下信息: 学号 姓名 年龄 性别 联系电话 学历 1 A 22 男 123456 小学 2 B 21 男 119 中学 3 C 23 男 110 高中 4 D 18 女 114 大学 我的答案: insert into student values(‘&1’,’&2’,’&3’); 一次一次添加 5)修改学生表的数据,将电话号码以11开头的学员的学历改为“大专” 我的答案: update student set xueli=”大专” where tel like 11%; 6)删除学生表的数据,姓名以C开头,性别为‘男’的记录删除 我的答案: delete student where name like C% or sex=”男”; 7)查询学生表的数据,将所有年龄小于22岁的,学历为“大专”的,学生的姓名和学号显示出来 我的答案: select name,studentCardNo from student where age<22 and xueli=”大专”; 8)查询学生表的数据,查询所有信息,列出前25%的记录 我的答案: select top*0.25 from student; 9)查询出所有学生的姓名,性别,年龄降序排列 我的答案: select name,sex,age from student where age desc; 10)按照性别分组查询所有的平均年龄 我的答案: select avg(age) from student group by sex; 18、什么是存储过程?为什么存储过程要比单纯的SQL语句执行起来要快? 我的答案: 存储过程算是一种优化查询需要比单存SQL语句执行的要快 19、两张关联表,删除主表中已经在副表中没有的信息 我的答案 delete from fubiao a where a.fid not in(select id from zhubiao) 20、程序题: 用1、2、2、3、4、5这六个数字,用java或你熟悉的语言,打印出所有不同的排列,如:512234、412345等,要求:“4”不能再第三位,“3”与“5”不能相连。并将这些数据按从小到大输出。 我的答案 我的写的不好 没贴下 笔试的时候没写全 21、String 和 StringBuffer的区别 我的答案 String定长 StringBuffer 变长 22、&和&&的区别 我的答案 &短路与 &&逻辑与 网上答案: & 是位运算符,表示按位与运算, && 是逻辑运算符,表示逻辑与(and)。 23、final,finally,finalize的区别 我的答案 Final静变量关键字,finally异常关键字,finalize 网上答案 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法, 可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 24、数组有没有length()这个方法?String有没有length()这个方法? 我的答案: 数组没有length()这个方法,有length的属性。 String有length()这个方法。 25、是否可以继承String类? 我的答案: 不可以 解释的很乱 26、说出数据连接池的工作机制是什么? 我的答案: 反正解释的很乱我感觉 27、垃圾回收的优点和原理。并考虑2种回收机制。 我的答案: 动态回收 解释的很乱 网上答案: Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解, 它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念, 只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。 垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有 使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。 回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 28、你所知道的集合类都有哪些?区别?主要方法? 我的答案: Arraylist 非线性的、Vertor线性的 29、JSP的内置对象及方法。 我的答案: Page,exception,out,page content,application,request,reponse,session,config 30、页面间对象传递的方法。 我的答案: 那几个方法都写错了 31、你知道Request对象的主要方法有哪些? 32、J2EE是技术还是平台还是框架? 我的答案: J2EE是技术也是平台 网上答案: J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。 J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。 33、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种(例如GBK编码类型)编码的字符串? Request encording(“GBK”) 34、j2ee常用的设计模式?说明工厂模式。 Gof23种设计模式 工厂模式:Factory 网上答案: Java中的23种设计模式: Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式), Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式), Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式), Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式), Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式), Observer(观察者模式), State(状态模式), Strategy(策略模式), Template Method(模板方法模式), Chain Of Responsibleity(责任链模式) 工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例, 通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。 首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。 然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。 当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。 35、JSP四种会话跟踪技术 我的答案: Application cookie session 36、排序都有哪几种方法?请举例 冒泡 选择 快序 二分查找 网上答案: 排序的方法有:插入排序(直接插入排序、希尔排序), 交换排序(冒泡排序、快速排序), 选择排序(直接选择排序、堆排序), 归并排序,分配排序(箱排序、基数排序) 快速排序的伪代码。 //使用快速排序方法对a[ 0 :n- 1 ]排序 从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点 把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点 递归地使用快速排序方法对left 进行排序 递归地使用快速排序方法对right 进行排序 所得结果为l e f t + m i d d l e + r i g h t 37、关于模块间的设计原则? 规范要一样 38、项目过程一般是怎样的?你参加过几个项目开发?参加过的项目流程是怎样的?自己负责与人合作工作内容及自我评价? 从需求调研——设计开发——实施 参加过网站的实施 模板的制作 39、tomcat自动关闭常见原因? 我的答案: 现在没遇到过 40、如何设置TOMCAT内存和连接数? 我的答案: Tomcat群集 41、你如何理解Tomcat是什么? 我的答案: Tomcat是JSP Servlet 容器恰当的说 42、静态变量和实例变量的区别? 我的答案: 静态变量域用final修饰,每次都被调用 实例变量则不会 43、IE、FF下面CSS的解释区别 我的答案: 自己编的 44、web前端技术你了解哪些技术? 我的答案: JAVAScript,CSS,DIV,Ajax,Ajax框架,DWR,dojo,jguery 45、什么是报表?什么是报表控件,作用是什么?你了解哪些报表工具? 我的答案: 解释的很乱 46、你了解的那些统计图表类型? 我的答案: 自己编的 47、Flex与数据库连接的三种方式? 我的答案: 自己编的 ------------------------------------------------------- 我答错的、 错在哪里? 没答上的帮忙解答下? 感激了 !
spring+myBatis数据不入库问题,求大神解答。
昨天做项目的时候遇到的问题,查询删除都是好的,保存死活不入库,以下是代码部分: ``` /** * 试题模版导入 * * @param session * @param response * @param request * @throws Exception */ @RequestMapping(value = "/templateImport", method = RequestMethod.POST) @ResponseBody public String templateImport(@RequestParam(value = "file", required = false) MultipartFile file, HttpSession session, HttpServletResponse response, HttpServletRequest request, ModelMap modelMap) { List<Map<Question, List<String>>> questionAndOptionsList = new ArrayList<Map<Question, List<String>>>();// 定义试题和答案的map集合对象集 List<Row> rowList = new ArrayList<Row>();// 定义行对象 String libraryId = request.getParameter("libraryId"); if (StringUtils.isEmpty(libraryId)) { modelMap.put("message", "未选择题库"); RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE); return null; } try { rowList = ExcelUtil.getRows(file, 1); } catch (Exception e) { modelMap.put("message", "解析模版出错"); RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE); return null; } int dateNum = rowList.size();// 定义数据总条数 int addNum = 0;// 定义新增数据条数 int updateNum = 0;// 定义修改数据条数 for (int i = 0; i < rowList.size(); i++) { Row row = rowList.get(i); Question question = new Question();// 定义试题对象 List<String> questionOptionList = new ArrayList<String>();// 定义接收所有解析到的试题选项 int cellNum = row.getLastCellNum();// 获取总列数 String questionTypeId = null; // 定义转换之后的试题类型 // 获取所有试题列的值 String content = ExcelUtil.getStringCellValue(row.getCell(0));// 获取试题内容 String questionTypeName = ExcelUtil.getStringCellValue(row.getCell(1));// 获取试题类型(拿到的是中文,需要自己转换) String answer = ExcelUtil.getStringCellValue(row.getCell(2));// 获取答案 String analysis = ExcelUtil.getStringCellValue(row.getCell(3));// 获取试题解析 /* * 试题信息非空校验 */ if (StringUtils.isEmpty(content)) { modelMap.put("message", "导入文件中第" + (i + 2) + "行的试题内容为空"); RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE); return null; } if (StringUtils.isEmpty(questionTypeName)) { modelMap.put("message", "导入文件中第" + (i + 2) + "行的试题类型为空"); RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE); return null; } else { // 解析试题类型为编码 switch (questionTypeName) { case "单选题": questionTypeId = Const.QUESTION_TYPE_ID_SINGLE; break; case "多选题": questionTypeId = Const.QUESTION_TYPE_ID_MULTIPLE; break; case "判断题": questionTypeId = Const.QUESTION_TYPE_ID_JUDGE; break; default: break; } } if (StringUtils.isEmpty(answer)) { modelMap.put("message", "导入文件中第" + (i + 2) + "行的答案为空"); RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE); return null; } /* * 试题信息长度校验 */ if (content.length() > 1000) { modelMap.put("message", "导入文件中第" + (i + 2) + "行的试题内容长度超出范围"); RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE); return null; } if (answer.length() > 200) { modelMap.put("message", "导入文件中第" + (i + 2) + "行的答案长度超出范围"); RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE); return null; } if (analysis.length() > 500) { modelMap.put("message", "导入文件中第" + (i + 2) + "行的试题解析长度超出范围"); RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE); return null; } /* * 校验通过之后设置question对象 */ question.setContent(content);// 设置内容 question.setQuestionTypeId(questionTypeId);// 设置类型 question.setAnswer(answer);// 设置答案 question.setLibraryId(libraryId);// 设置题库 question.setAnalysis(analysis);// 设置解析 question.setDelFlag("0");// 设置删除标识(1、为删除0、为未删除) /* * 开始解析试题答案信息 */ for (int j = 4; j < cellNum; j++) {// 定义从第5列开始解析答案信息,第5列之前都时试题信息 String questionOption = ExcelUtil.getStringCellValue(row.getCell(j));// 获取试题答案选项 if (!StringUtils.isEmpty(questionOption)) {// 判断试题选项是否为空,如果为空则不存储该选项,也不中断解析之后的选项列 questionOptionList.add(questionOption); } } Map<Question, List<String>> map = new HashMap<Question, List<String>>(); map.put(question, questionOptionList); questionAndOptionsList.add(map); } for (Map<Question, List<String>> questionAndOptions : questionAndOptionsList) { Set set = questionAndOptions.keySet(); Iterator iterator = set.iterator(); while (iterator.hasNext()) { Question keyQuestion = (Question) iterator.next(); **questionService.save(keyQuestion);// 保存试题信息** List<String> questionOptionsList = questionAndOptions.get(keyQuestion);// 获取该试题所有的选项 for (int j = 0; j < questionOptionsList.size() && j < 26; j++) { String content = questionOptionsList.get(j); char letterCapital = (char) (j + 65);// 将数字转换成对应的字母 QuestionOption questionOption = new QuestionOption();// 定义试题对象 questionOption.setContent(content);// 设置选项内容 questionOption.setQuestionId(keyQuestion.getId());// 设置试题ID questionOption.setName(String.valueOf(letterCapital));// 设置选项编号(A、B、C...) questionOption.setSortNum(String.valueOf(j));// 设置排序号 questionOption.setDelFlag("0");// 设置删除标识(1、为删除0、为未删除) **optionService.save(questionOption);// 保存试题对象** } } } modelMap.put("message", "新增数据:" + addNum + "条,修改数据:" + updateNum + "条,失败:" + (dateNum - addNum - updateNum) + "条"); RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.TRUE); return null; } ``` 跟此方法同类下的保存方法是可以运行的,并且数据也能入库,上述方法没有出现任何错误,并且执行save之后对象ID也会自动生成,但就时不入库。
基于tensorflow的pix2pix代码中如何做到输入图像和输出图像分辨率不一致
问题:例如在自己制作了成对的输入(input256×256 target 200×256)后,如何让输入图像和输出图像分辨率不一致,例如成对图像中:input的分辨率是256×256, output 和target都是200×256,需要修改哪里的参数。 论文参考:《Image-to-Image Translation with Conditional Adversarial Networks》 代码参考:https://blog.csdn.net/MOU_IT/article/details/80802407?utm_source=blogxgwz0 # coding=utf-8 from __future__ import absolute_import from __future__ import division from __future__ import print_function import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import tensorflow as tf import numpy as np import os import glob import random import collections import math import time # https://github.com/affinelayer/pix2pix-tensorflow train_input_dir = "D:/Project/pix2pix-tensorflow-master/facades/train/" # 训练集输入 train_output_dir = "D:/Project/pix2pix-tensorflow-master/facades/train_out/" # 训练集输出 test_input_dir = "D:/Project/pix2pix-tensorflow-master/facades/val/" # 测试集输入 test_output_dir = "D:/Project/pix2pix-tensorflow-master/facades/test_out/" # 测试集的输出 checkpoint = "D:/Project/pix2pix-tensorflow-master/facades/train_out/" # 保存结果的目录 seed = None max_steps = None # number of training steps (0 to disable) max_epochs = 200 # number of training epochs progress_freq = 50 # display progress every progress_freq steps trace_freq = 0 # trace execution every trace_freq steps display_freq = 50 # write current training images every display_freq steps save_freq = 500 # save model every save_freq steps, 0 to disable separable_conv = False # use separable convolutions in the generator aspect_ratio = 1 #aspect ratio of output images (width/height) batch_size = 1 # help="number of images in batch") which_direction = "BtoA" # choices=["AtoB", "BtoA"]) ngf = 64 # help="number of generator filters in first conv layer") ndf = 64 # help="number of discriminator filters in first conv layer") scale_size = 286 # help="scale images to this size before cropping to 256x256") flip = True # flip images horizontally no_flip = True # don't flip images horizontally lr = 0.0002 # initial learning rate for adam beta1 = 0.5 # momentum term of adam l1_weight = 100.0 # weight on L1 term for generator gradient gan_weight = 1.0 # weight on GAN term for generator gradient output_filetype = "png" # 输出图像的格式 EPS = 1e-12 # 极小数,防止梯度为损失为0 CROP_SIZE = 256 # 图片的裁剪大小 # 命名元组,用于存放加载的数据集合创建好的模型 Examples = collections.namedtuple("Examples", "paths, inputs, targets, count, steps_per_epoch") Model = collections.namedtuple("Model", "outputs, predict_real, predict_fake, discrim_loss, discrim_grads_and_vars, gen_loss_GAN, gen_loss_L1, gen_grads_and_vars, train") # 图像预处理 [0, 1] => [-1, 1] def preprocess(image): with tf.name_scope("preprocess"): return image * 2 - 1 # 图像后处理[-1, 1] => [0, 1] def deprocess(image): with tf.name_scope("deprocess"): return (image + 1) / 2 # 判别器的卷积定义,batch_input为 [ batch , 256 , 256 , 6 ] def discrim_conv(batch_input, out_channels, stride): # [ batch , 256 , 256 , 6 ] ===>[ batch , 258 , 258 , 6 ] padded_input = tf.pad(batch_input, [[0, 0], [1, 1], [1, 1], [0, 0]], mode="CONSTANT") ''' [0,0]: 第一维batch大小不扩充 [1,1]:第二维图像宽度左右各扩充一列,用0填充 [1,1]:第三维图像高度上下各扩充一列,用0填充 [0,0]:第四维图像通道不做扩充 ''' return tf.layers.conv2d(padded_input, out_channels, kernel_size=4, strides=(stride, stride), padding="valid", kernel_initializer=tf.random_normal_initializer(0, 0.02)) # 生成器的卷积定义,卷积核为4*4,步长为2,输出图像为输入的一半 def gen_conv(batch_input, out_channels): # [batch, in_height, in_width, in_channels] => [batch, out_height, out_width, out_channels] initializer = tf.random_normal_initializer(0, 0.02) if separable_conv: return tf.layers.separable_conv2d(batch_input, out_channels, kernel_size=4, strides=(2, 2), padding="same", depthwise_initializer=initializer, pointwise_initializer=initializer) else: return tf.layers.conv2d(batch_input, out_channels, kernel_size=4, strides=(2, 2), padding="same", kernel_initializer=initializer) # 生成器的反卷积定义 def gen_deconv(batch_input, out_channels): # [batch, in_height, in_width, in_channels] => [batch, out_height, out_width, out_channels] initializer = tf.random_normal_initializer(0, 0.02) if separable_conv: _b, h, w, _c = batch_input.shape resized_input = tf.image.resize_images(batch_input, [h * 2, w * 2], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) return tf.layers.separable_conv2d(resized_input, out_channels, kernel_size=4, strides=(1, 1), padding="same", depthwise_initializer=initializer, pointwise_initializer=initializer) else: return tf.layers.conv2d_transpose(batch_input, out_channels, kernel_size=4, strides=(2, 2), padding="same", kernel_initializer=initializer) # 定义LReLu激活函数 def lrelu(x, a): with tf.name_scope("lrelu"): # adding these together creates the leak part and linear part # then cancels them out by subtracting/adding an absolute value term # leak: a*x/2 - a*abs(x)/2 # linear: x/2 + abs(x)/2 # this block looks like it has 2 inputs on the graph unless we do this x = tf.identity(x) return (0.5 * (1 + a)) * x + (0.5 * (1 - a)) * tf.abs(x) # 批量归一化图像 def batchnorm(inputs): return tf.layers.batch_normalization(inputs, axis=3, epsilon=1e-5, momentum=0.1, training=True, gamma_initializer=tf.random_normal_initializer(1.0, 0.02)) # 检查图像的维度 def check_image(image): assertion = tf.assert_equal(tf.shape(image)[-1], 3, message="image must have 3 color channels") with tf.control_dependencies([assertion]): image = tf.identity(image) if image.get_shape().ndims not in (3, 4): raise ValueError("image must be either 3 or 4 dimensions") # make the last dimension 3 so that you can unstack the colors shape = list(image.get_shape()) shape[-1] = 3 image.set_shape(shape) return image # 去除文件的后缀,获取文件名 def get_name(path): # os.path.basename(),返回path最后的文件名。若path以/或\结尾,那么就会返回空值。 # os.path.splitext(),分离文件名与扩展名;默认返回(fname,fextension)元组 name, _ = os.path.splitext(os.path.basename(path)) return name # 加载数据集,从文件读取-->解码-->归一化--->拆分为输入和目标-->像素转为[-1,1]-->转变形状 def load_examples(input_dir): if input_dir is None or not os.path.exists(input_dir): raise Exception("input_dir does not exist") # 匹配第一个参数的路径中所有的符合条件的文件,并将其以list的形式返回。 input_paths = glob.glob(os.path.join(input_dir, "*.jpg")) # 图像解码器 decode = tf.image.decode_jpeg if len(input_paths) == 0: input_paths = glob.glob(os.path.join(input_dir, "*.png")) decode = tf.image.decode_png if len(input_paths) == 0: raise Exception("input_dir contains no image files") # 如果文件名是数字,则用数字进行排序,否则用字母排序 if all(get_name(path).isdigit() for path in input_paths): input_paths = sorted(input_paths, key=lambda path: int(get_name(path))) else: input_paths = sorted(input_paths) sess = tf.Session() with tf.name_scope("load_images"): # 把我们需要的全部文件打包为一个tf内部的queue类型,之后tf开文件就从这个queue中取目录了, # 如果是训练模式时,shuffle为True path_queue = tf.train.string_input_producer(input_paths, shuffle=True) # Read的输出将是一个文件名(key)和该文件的内容(value,每次读取一个文件,分多次读取)。 reader = tf.WholeFileReader() paths, contents = reader.read(path_queue) # 对文件进行解码并且对图片作归一化处理 raw_input = decode(contents) raw_input = tf.image.convert_image_dtype(raw_input, dtype=tf.float32) # 归一化处理 # 判断两个值知否相等,如果不等抛出异常 assertion = tf.assert_equal(tf.shape(raw_input)[2], 3, message="image does not have 3 channels") ''' 对于control_dependencies这个管理器,只有当里面的操作是一个op时,才会生效,也就是先执行传入的 参数op,再执行里面的op。如果里面的操作不是定义的op,图中就不会形成一个节点,这样该管理器就失效了。 tf.identity是返回一个一模一样新的tensor的op,这会增加一个新节点到gragh中,这时control_dependencies就会生效. ''' with tf.control_dependencies([assertion]): raw_input = tf.identity(raw_input) raw_input.set_shape([None, None, 3]) # 图像值由[0,1]--->[-1, 1] width = tf.shape(raw_input)[1] # [height, width, channels] a_images = preprocess(raw_input[:, :width // 2, :]) # 256*256*3 b_images = preprocess(raw_input[:, width // 2:, :]) # 256*256*3 # 这里的which_direction为:BtoA if which_direction == "AtoB": inputs, targets = [a_images, b_images] elif which_direction == "BtoA": inputs, targets = [b_images, a_images] else: raise Exception("invalid direction") # synchronize seed for image operations so that we do the same operations to both # input and output images seed = random.randint(0, 2 ** 31 - 1) # 图像预处理,翻转、改变形状 with tf.name_scope("input_images"): input_images = transform(inputs) with tf.name_scope("target_images"): target_images = transform(targets) # 获得输入图像、目标图像的batch块 paths_batch, inputs_batch, targets_batch = tf.train.batch([paths, input_images, target_images], batch_size=batch_size) steps_per_epoch = int(math.ceil(len(input_paths) / batch_size)) return Examples( paths=paths_batch, # 输入的文件名块 inputs=inputs_batch, # 输入的图像块 targets=targets_batch, # 目标图像块 count=len(input_paths), # 数据集的大小 steps_per_epoch=steps_per_epoch, # batch的个数 ) # 图像预处理,翻转、改变形状 def transform(image): r = image if flip: r = tf.image.random_flip_left_right(r, seed=seed) # area produces a nice downscaling, but does nearest neighbor for upscaling # assume we're going to be doing downscaling here r = tf.image.resize_images(r, [scale_size, scale_size], method=tf.image.ResizeMethod.AREA) offset = tf.cast(tf.floor(tf.random_uniform([2], 0, scale_size - CROP_SIZE + 1, seed=seed)), dtype=tf.int32) if scale_size > CROP_SIZE: r = tf.image.crop_to_bounding_box(r, offset[0], offset[1], CROP_SIZE, CROP_SIZE) elif scale_size < CROP_SIZE: raise Exception("scale size cannot be less than crop size") return r # 创建生成器,这是一个编码解码器的变种,输入输出均为:256*256*3, 像素值为[-1,1] def create_generator(generator_inputs, generator_outputs_channels): layers = [] # encoder_1: [batch, 256, 256, in_channels] => [batch, 128, 128, ngf] with tf.variable_scope("encoder_1"): output = gen_conv(generator_inputs, ngf) # ngf为第一个卷积层的卷积核核数量,默认为 64 layers.append(output) layer_specs = [ ngf * 2, # encoder_2: [batch, 128, 128, ngf] => [batch, 64, 64, ngf * 2] ngf * 4, # encoder_3: [batch, 64, 64, ngf * 2] => [batch, 32, 32, ngf * 4] ngf * 8, # encoder_4: [batch, 32, 32, ngf * 4] => [batch, 16, 16, ngf * 8] ngf * 8, # encoder_5: [batch, 16, 16, ngf * 8] => [batch, 8, 8, ngf * 8] ngf * 8, # encoder_6: [batch, 8, 8, ngf * 8] => [batch, 4, 4, ngf * 8] ngf * 8, # encoder_7: [batch, 4, 4, ngf * 8] => [batch, 2, 2, ngf * 8] ngf * 8, # encoder_8: [batch, 2, 2, ngf * 8] => [batch, 1, 1, ngf * 8] ] # 卷积的编码器 for out_channels in layer_specs: with tf.variable_scope("encoder_%d" % (len(layers) + 1)): # 对最后一层使用激活函数 rectified = lrelu(layers[-1], 0.2) # [batch, in_height, in_width, in_channels] => [batch, in_height/2, in_width/2, out_channels] convolved = gen_conv(rectified, out_channels) output = batchnorm(convolved) layers.append(output) layer_specs = [ (ngf * 8, 0.5), # decoder_8: [batch, 1, 1, ngf * 8] => [batch, 2, 2, ngf * 8 * 2] (ngf * 8, 0.5), # decoder_7: [batch, 2, 2, ngf * 8 * 2] => [batch, 4, 4, ngf * 8 * 2] (ngf * 8, 0.5), # decoder_6: [batch, 4, 4, ngf * 8 * 2] => [batch, 8, 8, ngf * 8 * 2] (ngf * 8, 0.0), # decoder_5: [batch, 8, 8, ngf * 8 * 2] => [batch, 16, 16, ngf * 8 * 2] (ngf * 4, 0.0), # decoder_4: [batch, 16, 16, ngf * 8 * 2] => [batch, 32, 32, ngf * 4 * 2] (ngf * 2, 0.0), # decoder_3: [batch, 32, 32, ngf * 4 * 2] => [batch, 64, 64, ngf * 2 * 2] (ngf, 0.0), # decoder_2: [batch, 64, 64, ngf * 2 * 2] => [batch, 128, 128, ngf * 2] ] # 卷积的解码器 num_encoder_layers = len(layers) # 8 for decoder_layer, (out_channels, dropout) in enumerate(layer_specs): skip_layer = num_encoder_layers - decoder_layer - 1 with tf.variable_scope("decoder_%d" % (skip_layer + 1)): if decoder_layer == 0: # first decoder layer doesn't have skip connections # since it is directly connected to the skip_layer input = layers[-1] else: input = tf.concat([layers[-1], layers[skip_layer]], axis=3) rectified = tf.nn.relu(input) # [batch, in_height, in_width, in_channels] => [batch, in_height*2, in_width*2, out_channels] output = gen_deconv(rectified, out_channels) output = batchnorm(output) if dropout > 0.0: output = tf.nn.dropout(output, keep_prob=1 - dropout) layers.append(output) # decoder_1: [batch, 128, 128, ngf * 2] => [batch, 256, 256, generator_outputs_channels] with tf.variable_scope("decoder_1"): input = tf.concat([layers[-1], layers[0]], axis=3) rectified = tf.nn.relu(input) output = gen_deconv(rectified, generator_outputs_channels) output = tf.tanh(output) layers.append(output) return layers[-1] # 创建判别器,输入生成的图像和真实的图像:两个[batch,256,256,3],元素值值[-1,1],输出:[batch,30,30,1],元素值为概率 def create_discriminator(discrim_inputs, discrim_targets): n_layers = 3 layers = [] # 2x [batch, height, width, in_channels] => [batch, height, width, in_channels * 2] input = tf.concat([discrim_inputs, discrim_targets], axis=3) # layer_1: [batch, 256, 256, in_channels * 2] => [batch, 128, 128, ndf] with tf.variable_scope("layer_1"): convolved = discrim_conv(input, ndf, stride=2) rectified = lrelu(convolved, 0.2) layers.append(rectified) # layer_2: [batch, 128, 128, ndf] => [batch, 64, 64, ndf * 2] # layer_3: [batch, 64, 64, ndf * 2] => [batch, 32, 32, ndf * 4] # layer_4: [batch, 32, 32, ndf * 4] => [batch, 31, 31, ndf * 8] for i in range(n_layers): with tf.variable_scope("layer_%d" % (len(layers) + 1)): out_channels = ndf * min(2 ** (i + 1), 8) stride = 1 if i == n_layers - 1 else 2 # last layer here has stride 1 convolved = discrim_conv(layers[-1], out_channels, stride=stride) normalized = batchnorm(convolved) rectified = lrelu(normalized, 0.2) layers.append(rectified) # layer_5: [batch, 31, 31, ndf * 8] => [batch, 30, 30, 1] with tf.variable_scope("layer_%d" % (len(layers) + 1)): convolved = discrim_conv(rectified, out_channels=1, stride=1) output = tf.sigmoid(convolved) layers.append(output) return layers[-1] # 创建Pix2Pix模型,inputs和targets形状为:[batch_size, height, width, channels] def create_model(inputs, targets): with tf.variable_scope("generator"): out_channels = int(targets.get_shape()[-1]) outputs = create_generator(inputs, out_channels) # create two copies of discriminator, one for real pairs and one for fake pairs # they share the same underlying variables with tf.name_scope("real_discriminator"): with tf.variable_scope("discriminator"): # 2x [batch, height, width, channels] => [batch, 30, 30, 1] predict_real = create_discriminator(inputs, targets) # 条件变量图像和真实图像 with tf.name_scope("fake_discriminator"): with tf.variable_scope("discriminator", reuse=True): # 2x [batch, height, width, channels] => [batch, 30, 30, 1] predict_fake = create_discriminator(inputs, outputs) # 条件变量图像和生成的图像 # 判别器的损失,判别器希望V(G,D)尽可能大 with tf.name_scope("discriminator_loss"): # minimizing -tf.log will try to get inputs to 1 # predict_real => 1 # predict_fake => 0 discrim_loss = tf.reduce_mean(-(tf.log(predict_real + EPS) + tf.log(1 - predict_fake + EPS))) # 生成器的损失,生成器希望V(G,D)尽可能小 with tf.name_scope("generator_loss"): # predict_fake => 1 # abs(targets - outputs) => 0 gen_loss_GAN = tf.reduce_mean(-tf.log(predict_fake + EPS)) gen_loss_L1 = tf.reduce_mean(tf.abs(targets - outputs)) gen_loss = gen_loss_GAN * gan_weight + gen_loss_L1 * l1_weight # 判别器训练 with tf.name_scope("discriminator_train"): # 判别器需要优化的参数 discrim_tvars = [var for var in tf.trainable_variables() if var.name.startswith("discriminator")] # 优化器定义 discrim_optim = tf.train.AdamOptimizer(lr, beta1) # 计算损失函数对优化参数的梯度 discrim_grads_and_vars = discrim_optim.compute_gradients(discrim_loss, var_list=discrim_tvars) # 更新该梯度所对应的参数的状态,返回一个op discrim_train = discrim_optim.apply_gradients(discrim_grads_and_vars) # 生成器训练 with tf.name_scope("generator_train"): with tf.control_dependencies([discrim_train]): # 生成器需要优化的参数列表 gen_tvars = [var for var in tf.trainable_variables() if var.name.startswith("generator")] # 定义优化器 gen_optim = tf.train.AdamOptimizer(lr, beta1) # 计算需要优化的参数的梯度 gen_grads_and_vars = gen_optim.compute_gradients(gen_loss, var_list=gen_tvars) # 更新该梯度所对应的参数的状态,返回一个op gen_train = gen_optim.apply_gradients(gen_grads_and_vars) ''' 在采用随机梯度下降算法训练神经网络时,使用 tf.train.ExponentialMovingAverage 滑动平均操作的意义在于 提高模型在测试数据上的健壮性(robustness)。tensorflow 下的 tf.train.ExponentialMovingAverage 需要 提供一个衰减率(decay)。该衰减率用于控制模型更新的速度。该衰减率用于控制模型更新的速度, ExponentialMovingAverage 对每一个(待更新训练学习的)变量(variable)都会维护一个影子变量 (shadow variable)。影子变量的初始值就是这个变量的初始值, shadow_variable=decay×shadow_variable+(1−decay)×variable ''' ema = tf.train.ExponentialMovingAverage(decay=0.99) update_losses = ema.apply([discrim_loss, gen_loss_GAN, gen_loss_L1]) # global_step = tf.train.get_or_create_global_step() incr_global_step = tf.assign(global_step, global_step + 1) return Model( predict_real=predict_real, # 条件变量(输入图像)和真实图像之间的概率值,形状为;[batch,30,30,1] predict_fake=predict_fake, # 条件变量(输入图像)和生成图像之间的概率值,形状为;[batch,30,30,1] discrim_loss=ema.average(discrim_loss), # 判别器损失 discrim_grads_and_vars=discrim_grads_and_vars, # 判别器需要优化的参数和对应的梯度 gen_loss_GAN=ema.average(gen_loss_GAN), # 生成器的损失 gen_loss_L1=ema.average(gen_loss_L1), # 生成器的 L1损失 gen_grads_and_vars=gen_grads_and_vars, # 生成器需要优化的参数和对应的梯度 outputs=outputs, # 生成器生成的图片 train=tf.group(update_losses, incr_global_step, gen_train), # 打包需要run的操作op ) # 保存图像 def save_images(output_dir, fetches, step=None): image_dir = os.path.join(output_dir, "images") if not os.path.exists(image_dir): os.makedirs(image_dir) filesets = [] for i, in_path in enumerate(fetches["paths"]): name, _ = os.path.splitext(os.path.basename(in_path.decode("utf8"))) fileset = {"name": name, "step": step} for kind in ["inputs", "outputs", "targets"]: filename = name + "-" + kind + ".png" if step is not None: filename = "%08d-%s" % (step, filename) fileset[kind] = filename out_path = os.path.join(image_dir, filename) contents = fetches[kind][i] with open(out_path, "wb") as f: f.write(contents) filesets.append(fileset) return filesets # 将结果写入HTML网页 def append_index(output_dir, filesets, step=False): index_path = os.path.join(output_dir, "index.html") if os.path.exists(index_path): index = open(index_path, "a") else: index = open(index_path, "w") index.write("<html><body><table><tr>") if step: index.write("<th>step</th>") index.write("<th>name</th><th>input</th><th>output</th><th>target</th></tr>") for fileset in filesets: index.write("<tr>") if step: index.write("<td>%d</td>" % fileset["step"]) index.write("<td>%s</td>" % fileset["name"]) for kind in ["inputs", "outputs", "targets"]: index.write("<td><img src='images/%s'></td>" % fileset[kind]) index.write("</tr>") return index_path # 转变图像的尺寸、并且将[0,1]--->[0,255] def convert(image): if aspect_ratio != 1.0: # upscale to correct aspect ratio size = [CROP_SIZE, int(round(CROP_SIZE * aspect_ratio))] image = tf.image.resize_images(image, size=size, method=tf.image.ResizeMethod.BICUBIC) # 将数据的类型转换为8位无符号整型 return tf.image.convert_image_dtype(image, dtype=tf.uint8, saturate=True) # 主函数 def train(): # 设置随机数种子的值 global seed if seed is None: seed = random.randint(0, 2 ** 31 - 1) tf.set_random_seed(seed) np.random.seed(seed) random.seed(seed) # 创建目录 if not os.path.exists(train_output_dir): os.makedirs(train_output_dir) # 加载数据集,得到输入数据和目标数据并把范围变为 :[-1,1] examples = load_examples(train_input_dir) print("load successful ! examples count = %d" % examples.count) # 创建模型,inputs和targets是:[batch_size, height, width, channels] # 返回值: model = create_model(examples.inputs, examples.targets) print("create model successful!") # 图像处理[-1, 1] => [0, 1] inputs = deprocess(examples.inputs) targets = deprocess(examples.targets) outputs = deprocess(model.outputs) # 把[0,1]的像素点转为RGB值:[0,255] with tf.name_scope("convert_inputs"): converted_inputs = convert(inputs) with tf.name_scope("convert_targets"): converted_targets = convert(targets) with tf.name_scope("convert_outputs"): converted_outputs = convert(outputs) # 对图像进行编码以便于保存 with tf.name_scope("encode_images"): display_fetches = { "paths": examples.paths, # tf.map_fn接受一个函数对象和集合,用函数对集合中每个元素分别处理 "inputs": tf.map_fn(tf.image.encode_png, converted_inputs, dtype=tf.string, name="input_pngs"), "targets": tf.map_fn(tf.image.encode_png, converted_targets, dtype=tf.string, name="target_pngs"), "outputs": tf.map_fn(tf.image.encode_png, converted_outputs, dtype=tf.string, name="output_pngs"), } with tf.name_scope("parameter_count"): parameter_count = tf.reduce_sum([tf.reduce_prod(tf.shape(v)) for v in tf.trainable_variables()]) # 只保存最新一个checkpoint saver = tf.train.Saver(max_to_keep=20) init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) print("parameter_count =", sess.run(parameter_count)) if max_epochs is not None: max_steps = examples.steps_per_epoch * max_epochs # 400X200=80000 # 因为是从文件中读取数据,所以需要启动start_queue_runners() # 这个函数将会启动输入管道的线程,填充样本到队列中,以便出队操作可以从队列中拿到样本。 coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) # 运行训练集 print("begin trainning......") print("max_steps:", max_steps) start = time.time() for step in range(max_steps): def should(freq): return freq > 0 and ((step + 1) % freq == 0 or step == max_steps - 1) print("step:", step) # 定义一个需要run的所有操作的字典 fetches = { "train": model.train } # progress_freq为 50,每50次计算一次三个损失,显示进度 if should(progress_freq): fetches["discrim_loss"] = model.discrim_loss fetches["gen_loss_GAN"] = model.gen_loss_GAN fetches["gen_loss_L1"] = model.gen_loss_L1 # display_freq为 50,每50次保存一次输入、目标、输出的图像 if should(display_freq): fetches["display"] = display_fetches # 运行各种操作, results = sess.run(fetches) # display_freq为 50,每50次保存输入、目标、输出的图像 if should(display_freq): print("saving display images") filesets = save_images(train_output_dir, results["display"], step=step) append_index(train_output_dir, filesets, step=True) # progress_freq为 50,每50次打印一次三种损失的大小,显示进度 if should(progress_freq): # global_step will have the correct step count if we resume from a checkpoint train_epoch = math.ceil(step / examples.steps_per_epoch) train_step = (step - 1) % examples.steps_per_epoch + 1 rate = (step + 1) * batch_size / (time.time() - start) remaining = (max_steps - step) * batch_size / rate print("progress epoch %d step %d image/sec %0.1f remaining %dm" % ( train_epoch, train_step, rate, remaining / 60)) print("discrim_loss", results["discrim_loss"]) print("gen_loss_GAN", results["gen_loss_GAN"]) print("gen_loss_L1", results["gen_loss_L1"]) # save_freq为500,每500次保存一次模型 if should(save_freq): print("saving model") saver.save(sess, os.path.join(train_output_dir, "model"), global_step=step) # 测试 def test(): # 设置随机数种子的值 global seed if seed is None: seed = random.randint(0, 2 ** 31 - 1) tf.set_random_seed(seed) np.random.seed(seed) random.seed(seed) # 创建目录 if not os.path.exists(test_output_dir): os.makedirs(test_output_dir) if checkpoint is None: raise Exception("checkpoint required for test mode") # disable these features in test mode scale_size = CROP_SIZE flip = False # 加载数据集,得到输入数据和目标数据 examples = load_examples(test_input_dir) print("load successful ! examples count = %d" % examples.count) # 创建模型,inputs和targets是:[batch_size, height, width, channels] model = create_model(examples.inputs, examples.targets) print("create model successful!") # 图像处理[-1, 1] => [0, 1] inputs = deprocess(examples.inputs) targets = deprocess(examples.targets) outputs = deprocess(model.outputs) # 把[0,1]的像素点转为RGB值:[0,255] with tf.name_scope("convert_inputs"): converted_inputs = convert(inputs) with tf.name_scope("convert_targets"): converted_targets = convert(targets) with tf.name_scope("convert_outputs"): converted_outputs = convert(outputs) # 对图像进行编码以便于保存 with tf.name_scope("encode_images"): display_fetches = { "paths": examples.paths, # tf.map_fn接受一个函数对象和集合,用函数对集合中每个元素分别处理 "inputs": tf.map_fn(tf.image.encode_png, converted_inputs, dtype=tf.string, name="input_pngs"), "targets": tf.map_fn(tf.image.encode_png, converted_targets, dtype=tf.string, name="target_pngs"), "outputs": tf.map_fn(tf.image.encode_png, converted_outputs, dtype=tf.string, name="output_pngs"), } sess = tf.InteractiveSession() saver = tf.train.Saver(max_to_keep=1) ckpt = tf.train.get_checkpoint_state(checkpoint) saver.restore(sess,ckpt.model_checkpoint_path) start = time.time() coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) for step in range(examples.count): results = sess.run(display_fetches) filesets = save_images(test_output_dir, results) for i, f in enumerate(filesets): print("evaluated image", f["name"]) index_path = append_index(test_output_dir, filesets) print("wrote index at", index_path) print("rate", (time.time() - start) / max_steps) if __name__ == '__main__': train() #test()
JedisAdapter 类一个错误,大家帮个忙检查一下,谢谢了
com.nowcoder.util.JedisAdapter : 发生异常java.net.SocketTimeoutException: Read timed out ``` package com.nowcoder.util; import com.alibaba.fastjson.JSON; import com.nowcoder.controller.IndexController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.ExceptionHandler; import redis.clients.jedis.*; import java.util.List; /** * Created by nowcoder on 2016/7/13. @Service public class JedisAdapter implements InitializingBean { private static final Logger logger = LoggerFactory.getLogger(JedisAdapter.class); public static void print(int index, Object obj) { System.out.println(String.format("%d,%s", index, obj.toString())); } public static void mainx(String[] args) { Jedis jedis = new Jedis(); jedis.flushAll(); // get,set jedis.set("hello", "world"); print(1, jedis.get("hello")); jedis.rename("hello", "newhello"); print(1, jedis.get("newhello")); jedis.setex("hello2", 15, "world"); // 数值操作 jedis.set("pv", "100"); jedis.incr("pv"); jedis.decrBy("pv", 5); print(2, jedis.get("pv")); print(3, jedis.keys("*")); // 列表操作, 最近来访, 粉丝列表,消息队列 String listName = "list"; jedis.del(listName); for (int i = 0; i < 10; ++i) { jedis.lpush(listName, "a" + String.valueOf(i)); } print(4, jedis.lrange(listName, 0, 12)); // 最近来访10个id print(5, jedis.llen(listName)); print(6, jedis.lpop(listName)); print(7, jedis.llen(listName)); print(8, jedis.lrange(listName, 2, 6)); // 最近来访10个id print(9, jedis.lindex(listName, 3)); print(10, jedis.linsert(listName, BinaryClient.LIST_POSITION.AFTER, "a4", "xx")); print(10, jedis.linsert(listName, BinaryClient.LIST_POSITION.BEFORE, "a4", "bb")); print(11, jedis.lrange(listName, 0, 12)); // hash, 可变字段 String userKey = "userxx"; jedis.hset(userKey, "name", "jim"); jedis.hset(userKey, "age", "12"); jedis.hset(userKey, "phone", "18666666666"); print(12, jedis.hget(userKey, "name")); print(13, jedis.hgetAll(userKey)); jedis.hdel(userKey, "phone"); print(14, jedis.hgetAll(userKey)); print(15, jedis.hexists(userKey, "email")); print(16, jedis.hexists(userKey, "age")); print(17, jedis.hkeys(userKey)); print(18, jedis.hvals(userKey)); jedis.hsetnx(userKey, "school", "zju"); jedis.hsetnx(userKey, "name", "yxy"); print(19, jedis.hgetAll(userKey)); // 集合,点赞用户群, 共同好友 String likeKey1 = "newsLike1"; String likeKey2 = "newsLike2"; for (int i = 0; i < 10; ++i) { jedis.sadd(likeKey1, String.valueOf(i)); jedis.sadd(likeKey2, String.valueOf(i * 2)); } print(20, jedis.smembers(likeKey1)); print(21, jedis.smembers(likeKey2)); print(22, jedis.sunion(likeKey1, likeKey2)); print(23, jedis.sdiff(likeKey1, likeKey2)); print(24, jedis.sinter(likeKey1, likeKey2)); print(25, jedis.sismember(likeKey1, "12")); print(26, jedis.sismember(likeKey2, "12")); jedis.srem(likeKey1, "5"); print(27, jedis.smembers(likeKey1)); // 从1移动到2 jedis.smove(likeKey2, likeKey1, "14"); print(28, jedis.smembers(likeKey1)); print(29, jedis.scard(likeKey1)); // 排序集合,有限队列,排行榜 String rankKey = "rankKey"; jedis.zadd(rankKey, 15, "Jim"); jedis.zadd(rankKey, 60, "Ben"); jedis.zadd(rankKey, 90, "Lee"); jedis.zadd(rankKey, 75, "Lucy"); jedis.zadd(rankKey, 80, "Mei"); print(30, jedis.zcard(rankKey)); print(31, jedis.zcount(rankKey, 61, 100)); // 改错卷了 print(32, jedis.zscore(rankKey, "Lucy")); jedis.zincrby(rankKey, 2, "Lucy"); print(33, jedis.zscore(rankKey, "Lucy")); jedis.zincrby(rankKey, 2, "Luc"); print(34, jedis.zscore(rankKey, "Luc")); print(35, jedis.zcount(rankKey, 0, 100)); // 1-4 名 Luc print(36, jedis.zrange(rankKey, 0, 10)); print(36, jedis.zrange(rankKey, 1, 3)); print(36, jedis.zrevrange(rankKey, 1, 3)); for (Tuple tuple : jedis.zrangeByScoreWithScores(rankKey, "60", "100")) { print(37, tuple.getElement() + ":" + String.valueOf(tuple.getScore())); } print(38, jedis.zrank(rankKey, "Ben")); print(39, jedis.zrevrank(rankKey, "Ben")); String setKey = "zset"; jedis.zadd(setKey, 1, "a"); jedis.zadd(setKey, 1, "b"); jedis.zadd(setKey, 1, "c"); jedis.zadd(setKey, 1, "d"); jedis.zadd(setKey, 1, "e"); print(40, jedis.zlexcount(setKey, "-", "+")); print(41, jedis.zlexcount(setKey, "(b", "[d")); print(42, jedis.zlexcount(setKey, "[b", "[d")); jedis.zrem(setKey, "b"); print(43, jedis.zrange(setKey, 0, 10)); jedis.zremrangeByLex(setKey, "(c", "+"); print(44, jedis.zrange(setKey, 0, 2)); /* jedis.lpush("aaa", "A"); jedis.lpush("aaa", "B"); jedis.lpush("aaa", "C"); print(45, jedis.brpop(0, "aaa")); print(45, jedis.brpop(0, "aaa")); print(45, jedis.brpop(0, "aaa")); */ JedisPool pool = new JedisPool(); for (int i = 0; i < 100; ++i) { Jedis j = pool.getResource(); j.get("a"); j.close(); } } private Jedis jedis = null; private JedisPool pool = null; @Override public void afterPropertiesSet() throws Exception { //jedis = new Jedis("localhost"); pool = new JedisPool("localhost", 6379); } public String get(String key) { Jedis jedis = null; try { jedis = pool.getResource(); return jedis.get(key); } catch (Exception e) { logger.error("发生异常" + e.getMessage()); return null; } finally { if (jedis != null) { jedis.close(); } } } public void set(String key, String value) { Jedis jedis = null; try { jedis = pool.getResource(); jedis.set(key, value); } catch (Exception e) { logger.error("发生异常" + e.getMessage()); } finally { if (jedis != null) { jedis.close(); } } } public long sadd(String key, String value) { Jedis jedis = null; try { jedis = pool.getResource(); return jedis.sadd(key, value); } catch (Exception e) { logger.error("发生异常" + e.getMessage()); return 0; } finally { if (jedis != null) { jedis.close(); } } } public long srem(String key, String value) { Jedis jedis = null; try { jedis = pool.getResource(); return jedis.srem(key, value); } catch (Exception e) { logger.error("发生异常" + e.getMessage()); return 0; } finally { if (jedis != null) { jedis.close(); } } } public boolean sismember(String key, String value) { Jedis jedis = null; try { jedis = pool.getResource(); return jedis.sismember(key, value); } catch (Exception e) { logger.error("发生异常" + e.getMessage()); return false; } finally { if (jedis != null) { jedis.close(); } } } public long scard(String key) { Jedis jedis = null; try { jedis = pool.getResource(); return jedis.scard(key); } catch (Exception e) { logger.error("发生异常" + e.getMessage()); return 0; } finally { if (jedis != null) { jedis.close(); } } } public void setex(String key, String value) { // 验证码, 防机器注册,记录上次注册时间,有效期3天 Jedis jedis = null; try { jedis = pool.getResource(); jedis.setex(key, 10, value); } catch (Exception e) { logger.error("发生异常" + e.getMessage()); } finally { if (jedis != null) { jedis.close(); } } } public long lpush(String key, String value) { Jedis jedis = null; try { jedis = pool.getResource(); return jedis.lpush(key, value); } catch (Exception e) { logger.error("发生异常" + e.getMessage()); return 0; } finally { if (jedis != null) { jedis.close(); } } } public List<String> brpop(int timeout, String key) { Jedis jedis = null; try { jedis = pool.getResource(); return jedis.brpop(timeout, key); } catch (Exception e) { logger.error("发生异常" + e.getMessage()); return null; } finally { if (jedis != null) { jedis.close(); } } } public void setObject(String key, Object obj) { set(key, JSON.toJSONString(obj)); } public <T> T getObject(String key, Class<T> clazz) { String value = get(key); if (value != null) { return JSON.parseObject(value, clazz); } return null; } } */ ```
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载 点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
GitHub标星近1万:只需5秒音源,这个网络就能实时“克隆”你的声音
作者 | Google团队 译者 | 凯隐 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 本文中,Google 团队提出了一种文本语音合成(text to speech)神经系统,能通过少量样本学习到多个不同说话者(speaker)的语音特征,并合成他们的讲话音频。此外,对于训练时网络没有接触过的说话者,也能在不重新训练的情况下,仅通过未知...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
【管理系统课程设计】美少女手把手教你后台管理
【文章后台管理系统】URL设计与建模分析+项目源码+运行界面 栏目管理、文章列表、用户管理、角色管理、权限管理模块(文章最后附有源码) 1. 这是一个什么系统? 1.1 学习后台管理系统的原因 随着时代的变迁,现如今各大云服务平台横空出世,市面上有许多如学生信息系统、图书阅读系统、停车场管理系统等的管理系统,而本人家里就有人在用烟草销售系统,直接在网上完成挑选、购买与提交收货点,方便又快捷。 试想,若没有烟草销售系统,本人家人想要购买烟草,还要独自前往药...
4G EPS 第四代移动通信系统
目录 文章目录目录4G 与 LTE/EPCLTE/EPC 的架构E-UTRANE-UTRAN 协议栈eNodeBEPCMMES-GWP-GWHSSLTE/EPC 协议栈概览 4G 与 LTE/EPC 4G,即第四代移动通信系统,提供了 3G 不能满足的无线网络宽带化,主要提供数据(上网)业务。而 LTE(Long Term Evolution,长期演进技术)是电信领域用于手机及数据终端的高速无线通...
相关热词 如何提升c#开发能力 矩阵乘法c# c#调用谷歌浏览器 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天
立即提问