如何给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集合中的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; }
我这个只能捕获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; } } */ ```
130 个相见恨晚的超实用网站,一次性分享出来
相见恨晚的超实用网站 持续更新中。。。
我花了一夜用数据结构给女朋友写个H5走迷宫游戏
起因 又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个迷宫小游戏啥的! 当我码完字准备睡觉时:写不好别睡觉! 分析 如果用数据结构与算法造出东西来呢? ...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
win10系统安装教程(U盘PE+UEFI安装)
一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱 极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件, 选择安装到U盘(按照操作无需更改) 三、重启进入pe系统 1、关机后,将U盘插入电脑 2、按下电源后,按住F12进入启动项选择(技嘉主板是F12) 选择需要启...
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Ol4网格生成以及优化
概述 先描述一下大致场景:以0.05为单元格大小生成网格,并在地图上绘制,绘制的时候需要区分海陆。本文以此需求为契机,简单描述一下该需求的实现以及如何来优化。 效果 实现 优化前 var source = new ol.source.Vector({ features: [] }); var vector = new ol.layer.Vector({ source...
11月19日科技资讯|华为明日发布鸿蒙整体战略;京东宣告全面向技术转型;Kotlin 1.3.60 发布
「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。扫描上方二维码进入 CSDN App 可以收听御姐萌妹 Style 的人工版音频哟。 一分钟速览新闻点! 6G 专家组成员:速率是 5G 的 10 至 100 倍,预计 2030 年商用 雷军:很多人多次劝我放弃WPS,能坚持下来并不是纯粹的商业决定 ...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
Python语言高频重点汇总
Python语言高频重点汇总 GitHub面试宝典仓库 回到首页 目录: Python语言高频重点汇总 目录: 1. 函数-传参 2. 元类 3. @staticmethod和@classmethod两个装饰器 4. 类属性和实例属性 5. Python的自省 6. 列表、集合、字典推导式 7. Python中单下划线和双下划线 8. 格式化字符串中的%和format 9. 迭代器和生成器 10...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
程序员该看的几部电影
1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?如何...
蓝桥杯知识点汇总:基础知识和常用算法
文章目录基础语法部分:算法竞赛常用API:算法部分数据结构部分 此系列包含蓝桥杯绝大部分所考察的知识点,以及真题题解~ 基础语法部分: 备战蓝桥杯java(一):一般输入输出 和 快速输入输(BufferedReader&amp;BufferedWrite) 备战蓝桥杯java(二):java编程规范和常用数据类型 备战蓝桥杯java(三):常用功能符以及循环结构和分支结构 备战蓝桥杯java(四...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
@程序员,如何花式构建线程?
作者 |曾建责编 | 郭芮出品 | CSDN(ID:CSDNnews)在项目和业务的开发中,我们难免要经常使用线程来进行业务处理,使用线程可以保证我们的业务在相互处理之间可以保证原子性...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
实现简单的轮播图(单张图片、多张图片)
前言 刚学js没多久,这篇博客就当做记录了,以后还会完善的,希望大佬们多多指点。ps:下面出现的都是直接闪动,没有滑动效果的轮播图。 单张图片的替换 · ...
强烈推荐10本程序员在家读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
Linux自学篇——linux命令英文全称及解释
man: Manual 意思是手册,可以用这个命令查询其他命令的用法。 pwd:Print working directory 意思是密码。 su:Swith user 切换用户,切换到root用户 cd:Change directory 切换目录 ls:List files 列出目录下的文件 ps:Process Status 进程状态 mkdir:Make directory ...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
疫情数据接口api
返回json示例 { "errcode":0,//0标识接口正常 "data":{ "date":"2020-01-30 07:47:23",//实时更新时间 "diagnosed":7736,//确诊人数 "suspect":12167,//疑是病例人数 "death":170,//死亡人数 "cur...
智力题(程序员面试经典)
NO.1  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 解法 有时候,严格的限制条件有可能反倒是解题的线索。在这个问题中,限制条件是天平只能用一次。 因为天平只能用一次,我们也得以知道一个有趣的事实:一次必须同时称很多药丸,其实更准确地说,是必须从19瓶拿出药丸进行称重。否则,如果跳过两瓶或更多瓶药...
Java与Python学习通法(1)和(2)序言和编程语言发展史怎么学
dd
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问