list中有一批数据,每次取10笔出来处理

public static void main(String[] args) {
List list = new ArrayList();

for (int i = 0; i < 13; i++) {

list.add(i);

}

System.out.println(list);

int init = 10;// 每隔1000条循环一次

        int total = list.size();  
        int cycelTotal = total / init;  
        if (total % init != 0) {  
            cycelTotal += 1;  
            if (total < init) {  
                init = list.size();  
            }  
        }  

        System.out.println("循环保存的次数:"+cycelTotal);//循环多少次  

        List list2 = new ArrayList();  

        for (int i = 0; i < cycelTotal; i++) {  
            for (int j = 0; j < init; j++) {  
                if (list.get(j) == null) {  
                    break;  
                }  
                list2.add(list.get(j));  
            }  
            System.out.println("保存1000条数据到数据库....");  
            System.out.println(list2);//每次循环保存的数据输出  
            //接下来写保存数据库方法  
            //.............  
            list.removeAll(list2);//移出已经保存过的数据  
            list2.clear();//移出当前保存的数据  
        }  
}

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

结果:

循环保存的次数:2
保存1000条数据到数据库....
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

异常:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3

6个回答

你数组的长度小于了你要取出数据的长度

数组越界了

for (int i = 0; i < 13; i++) {
list.add(i);
}这边总共13条数据,你下面循环遍历的时候第二次循环数值是10-19 超过了13

a314066646
FEN_TA list.removeAll(list2);//移出已经保存过的数据 list2.clear();//移出当前保存的数据 list1中的数据移除了 size就改变了
2 年多之前 回复

你在第二次循环的时候if (list.get(j) == null) { 这句就会报错

happy814506779
闻说笔端有风月666 第一次循环玩,list只剩下3个元素,你再内层循环0~10,肯定会报数组越界的
2 年多之前 回复

其实可以直接用

 aa.subList(0, 10);

一次取出十条数据,下一次取的时候

  aa.subList(9, 10);

这个得意思是从哪个下标开始,取多少条

do{
......
}while(index==10);

大神们已经给你答案了,就是越界的问题。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
接口下行批量数据和数据库数据做唯一校验
我向外开放一个接口,调用方给我下行数据,每次下行参数中有一个list列表, 里面封装很多个对象,最多封装500个,对象的字段有SystemsCode,Name,RequestId,phone等。我收到请求后解析数据做基本数据校验,比如字段不能为空,电话号码是否正确等,基本校验完毕后将正确的数据入库,然后返回校验结果和入库结果,也就是告诉调用方哪些数据是错误的,哪些数据是正常入库的。现在调用方有个新的需求,就是一天内RequestId相同的数据我这里只入库一份,比如第一次推一个RequestId为1001的数据我正常入库,然后他们第二次又推了RequestId为1001的数据但我这里就不入库了。接口调用方有多个,现在我就得校验他们每次下行的数据,根据SystemsCode和RequestId确定每条数据是否唯一。由于请求量多数据量也比较大,估计一天有几百万到以千万的量,所有问问各位大神有没有好一点的算法或者思路来应对这样的场景。
Mybatis执行insert all 的时候 越来越慢是什么原因
情况描述: 数据库是Oracle 每次从表里取出10000条数据 进行计算 结果大概500~1000条 然后把这几百条数据批量插入数据库中 插入的表没有索引 就是很简单的几个字段 第一次执行 大概3S左右就插入成功了 第二次执行一下要50S左右 再往下越来越长。。不知道什么原因 有大佬遇到过吗 还有就是 当这个insert all变慢之后 对数据库进行 ddl操作都会卡死。。。而dml没有影响~ java这边数据库连接池用的druid ![这是第一次](https://img-ask.csdn.net/upload/201808/22/1534902304_166443.png) ![这是第二次](https://img-ask.csdn.net/upload/201808/22/1534902180_574360.png) sql如下 ``` <insert id="batchInsertArriveInfo" parameterType="java.util.List" useGeneratedKeys="false"> insert all <foreach collection="list" item="info" index="index"> into T_ARRIVAL_STATION_INFORMATION (BUS_PATH_ID,STATION_SN,TASK_STATUS,ARR_TIME,BUS_PATH_NAME,RUN_FLAG,VEHICLE_ID,station_name,station_id) values ( #{info.busPathId},#{info.stationSn},#{info.taskStatus}, #{info.arrTime},#{info.busPathName},#{info.runFlag}, #{info.vehicleId},#{info.stationName},#{info.stationId} ) </foreach> select 1 from dual </insert> ```
Oracle+for 循环10万数据,卡!
int totalCount = Convert.ToInt32(DBsource.ReturnID("SELECT count(UserEmail) CategoryID FROM tableName where isactive=1").ToString()); // [color=red]获取用户列表总行数 totalCount=100000[/color] int Count = 0; if (totalCount % 1000 == 0) /* 听说for 循环次数超过5000,就不能运行了。所以进行拆分,让循环 { Count = totalCount / 1000; } 次数变为1000; else { Count = totalCount / 1000; Count = Count + 1; } int rowCount = 0; for (int i = 0; i < Count; i++)[color=red] // 外循环控制循环几个1000;[/color] { for (int j = 0; j < 1000; j++)[color=red] // 内循环空间循环1000次[/color] { rowCount++; [color=red]//得到用户列表为10万的其中一个用户[/color] string useremail = DBsource.ReturnUserEmail("select U.UserEmail from (select UserEmail,ROWNUM RN from tablename where isactive=1) U where RN=" + rowCount).ToString(); [color=red]//给查询出来的用户发信息[/color] mesg = ad.AddMessages(conn, ad.PlusNumber(conn, "select MAX(MessageID) from tablename"), this.txtTitle.Text, this.txtContent.Text, useremail, Session["adminname"].ToString(), DateTime.Now.ToString()); [color=red]//判断是进行到最后一个1000的 循环[/color] if (i == Count - 1) { if (rowCount == totalCount)[color=red] //如果等于总行数,循环完毕跳出循环[/color] { break; } } } } 现在就是这个代码在程序运行时,直接就卡到那了,不能运行! [b]问题补充:[/b] 谢谢您的回答, 准备采用批量从数据库取出用户列表。每次1500条! 使用OraclePreparedStatement 但是找不到这个类的引用啊? 请帮助 [b]问题补充:[/b] 我用的是。net ! 现在可以从数据库取出全部用户列表。效率也很快! 现在给用户发信息 就相当于往数据库-表插入10W 行数据! 我写了存储过程! 但是还是需要10分钟啊! 存储过程里面是一条一条的插入数据! create or replace procedure addMsg ( msgid number, msgtitle varchar2, msgcontent varchar2, useremail user_list, sender varchar2, sendtime varchar2 ) as begin for x in 1..useremail.count loop insert into T_Messages values(msgid,msgtitle,msgcontent,useremail(x),sender,0,sendtime); end loop; end; /
Mysql批量插入和更新的性能
利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题。 1.批量插入。我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不固定),循环3000次。每次在循环到100次左右的时候,会出现“com.jolbox.bonecp.ConnectionPartition - BoneCP detected an unclosed connection and will now attempt to close it for you. You should be closing this connection in your application - enable connectionWatch for additional debugging assistance.”,紧接着程序就没有反映了。 2.批量更新。每次批量更新的数据量大约在3w条左右,居然要耗时16秒左右,有没有办法提高性能至2秒左右。代码如下: [code="java"] String sql = "replace into savedata(id , saveId , saveKey , value)values(?,?,?,?)"; Session session = getSessionFactory().openSession(); Connection conn = session.connection(); Transaction tx=getSessionFactory().openSession().beginTransaction(); try { PreparedStatement stmt=conn.prepareStatement(sql); for (Savedata savedata : list) { stmt.setString(1, savedata.getId()); stmt.setString(2, savedata.getSaveId()); stmt.setString(3, savedata.getSaveKey()); stmt.setString(4, savedata.getValue()); stmt.addBatch(); } stmt.executeBatch(); tx.commit(); } catch (Exception e) { }finally{ try { conn.close(); } catch (SQLException e) { log.warn("the db connection cant not close!" ,e); } if(session.isOpen()) session.close(); } [/code]
数据转移OOM的问题(急)
[b] ---------Consumer myList.size():3 Consumer: 2 ---------Consumer myList.size():2 Consumer: 1 ---------Consumer myList.size():1 Consumer: 0 myList warning: it's empty! star:234000 end:236000 Exception in thread "Thread-3" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2882) at java.lang.StringCoding.trim(StringCoding.java:71) at java.lang.StringCoding.access$100(StringCoding.java:34) at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:147) at java.lang.StringCoding.decode(StringCoding.java:169) at java.lang.String.<init>(String.java:444) at com.mysql.jdbc.ResultSetRow.getString(ResultSetRow.java:760) at com.mysql.jdbc.BufferRow.getString(BufferRow.java:538) at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5557) at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5434) at com.mysql.jdbc.ResultSetImpl.getStringForClob(ResultSetImpl.java:5485) at com.mysql.jdbc.ResultSetImpl.getObject(ResultSetImpl.java:4821) at cn.lake.databases.MysqlClass.executeQuery(MysqlClass.java:464) at cn.lake.start.DoStart$Producer.run(DoStart.java:97)[/b] 原码部分: package cn.lake.start; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import cn.lake.cache.DataProperties; import cn.lake.cache.Property; import cn.lake.databases.MysqlClass; import cn.lake.databases.MysqlConnetionPool; import cn.lake.util.MSTMConfig; public class DoStart { private LinkedList<Object> myList = new LinkedList<Object>(); private static LinkedList<Property> propertyList = new LinkedList<Property>(); private int MAX = 100; private final Lock lock = new ReentrantLock(); private final Condition full = lock.newCondition(); private final Condition empty = lock.newCondition(); public DoStart() { } public void start() { new Producer().start(); new Consumer().start(); } public static void main(String[] args) throws Exception { DoStart s2 = new DoStart(); addPaginateion(); s2.start(); } private static void addPaginateion() { MSTMConfig mconfig = new MSTMConfig(); MysqlClass mysqlConnect; MysqlConnetionPool mysqlConnectionPool = new MysqlConnetionPool(mconfig.myServerName, mconfig.myDbName, mconfig.myLoginName,mconfig.myLoginPwd); List rs = null; String sql = "SELECT COUNT(*) as exp From tb_paid_resume_info"; mysqlConnect = new MysqlClass(mysqlConnectionPool); rs = mysqlConnect.executeQuery(sql); int count = Integer.parseInt(((Map) rs.get(0)).get("exp") .toString()); // 分页数 int pagination = 0; int paginationSpare = count % mconfig.myReadCount; System.out.println("数据库总数据量为:" + count); System.out.println("分页大小为:" + mconfig.myReadCount); if (paginationSpare == 0) { pagination = count / mconfig.myReadCount; } else { pagination = count / mconfig.myReadCount + 1; } Property property = null; DataProperties dproperty = null; for (int i = 1; i <= pagination; i++) { int endPoint = i * mconfig.myReadCount; if (i == 1) { property = new Property(0, endPoint); } else { if (i == pagination) { property = new Property((i - 1)* mconfig.myReadCount, count); } else { property = new Property((i - 1)* mconfig.myReadCount, endPoint); } } propertyList.add(property); } } class Producer extends Thread { public void run() { while (true) { lock.lock(); try { System.out.println("-------------Producer myList.size():"+myList.size()); while (myList.size() > MAX) { System.out.println("warning: it's full!"); full.await(); } if(propertyList.size()>0){ List resumeRs= null; MSTMConfig mconfig = new MSTMConfig(); MysqlClass mysqlConnect; MysqlConnetionPool mysqlConnectionPool = new MysqlConnetionPool(mconfig.myServerName, mconfig.myDbName, mconfig.myLoginName,mconfig.myLoginPwd); int star= propertyList.getLast().getStart(); int end= propertyList.getLast().getEnd(); System.out.println("star:"+star); System.out.println("end:"+end); String resumeSql = "SELECT * From tb_paid_resume_info limit "+star+","+end; mysqlConnect = new MysqlClass(mysqlConnectionPool); resumeRs = mysqlConnect.executeQuery(resumeSql); for(int r=0;r<resumeRs.size();r++){ if (myList.add(r)) { System.out.println("Producer: " + r); } } empty.signal(); propertyList.removeLast(); System.out.println("==================propertyList.size():"+propertyList.size()); } } catch (InterruptedException ie) { System.out.println("producer is interrupted!"); } finally { lock.unlock(); } } } } class Consumer extends Thread { public void run() { while (true) { lock.lock(); try { while (myList.size() ==0) { System.out.println("myList warning: it's empty!"); empty.await(); } System.out.println("---------Consumer myList.size():"+myList.size()); Object o = myList.removeLast(); System.out.println("Consumer: " + o); full.signal(); } catch (InterruptedException ie) { System.out.println("consumer is interrupted!"); } finally { lock.unlock(); } } } } } ===数据库总数据量为:321323 分页大小为:2000 请各位帮看看是什么问题,老OOM,请到10万时就OOM /** * 执行查询语句 * * @param sql * @return */ public List executeQuery(String sql) { ConnectionWrapper connectionWrapper = this.getConnectionWrapper(); Statement stmt = this.getStmt(connectionWrapper.connection); List<Map> list = new ArrayList<Map>(); int mysqlErrorTimes = 1; while (mysqlErrorTimes > 0 && mysqlErrorTimes <= 10) { try { ResultSet rs = null; rs = (ResultSet) stmt.executeQuery(sql); if (rs != null) { ResultSetMetaData rsmd = (ResultSetMetaData) rs .getMetaData(); while (rs.next()) { Map<Object, Object> map = new HashMap<Object, Object>(); for (int i = 1; i <= rsmd.getColumnCount(); i++) { map.put(rsmd.getColumnName(i), rs.getObject(i)); } list.add(map); } } rs.close(); rs = null; mysqlErrorTimes = 0; } catch (Exception e) { connectionWrapper = isError(connectionWrapper, stmt, sql, e); stmt = this.getStmt(connectionWrapper.connection); mysqlErrorTimes++; } } this.release(connectionWrapper.connection, stmt); return list; } } [b]问题补充:[/b] 首先,謝謝大家支持; 就是使用-Xmx参数配置你JVM执行程序时的最大使用内存。 二、如果执行以上命令仍内存溢出的话,仔细检查你的批量处理代码,修正其中的问题。 對JVM增大內存我試過,當內存增大到1G時,可以跑到10萬的量,然后又OOM,而批量處理,不好意思,這里我還沒有做批量的處理,只是打印出來而已,并沒有做插入動作,所以這個不需要考慮; 數據庫,我每次查詢都有一個 mysqlErrorTimes++; } } [b]this.release(connectionWrapper.connection, stmt); [/b] return list; } 釋放和關閉動作,所以我才奇怪!
基于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()
使用HQL查询Oracle日期字段,报"Invalid number"
如题,Oracle数据库里面有一批记录,现在我想根据其中一个叫:txn_date的字段来查询记录,在Hbm文件中我配置了该HQL,如下所示: [code="xml"] <sql-query name="job.getJobByDate"> select {job.*} from Newsletter_Message job where to_char(:dateType,'yyyy-mm-dd hh24:mi') = to_char(:jobDate, 'yyyy-mm-dd hh24:mi') <return alias="job" class="com.newsletter.domain.job.Job" /> </sql-query> [/code] 在DAO方法中我使用了Spring的HibernateTemplate,方法如下: [code="java"] public List<Job> getJobByDate(final Date jobDate, final String dateType) { return (List<Job> getHibernateTemplate().executeFind( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query query = session.getNamedQuery"job.getJobByDate"); query.setString("dateType", dateType); query.setDate("jobDate",jobDate); return query.list(); } });} [/code] Hibernate生成的SQL语句如下 [code="SQL"] select job.TXN_NO as TXN1_5_0_, job.TXN_TYPE as TXN2_5_0_, job.TXN_DATE as TXN3_5_0_, from Newsletter_Message job where to_char(?, 'yyyy-mm-dd hh24:mi') = to_char(?, 'yyyy-mm-dd hh24:mi') [/code] 每次执行时,总是抛异常,说: org.springframework.dao.DataIntegrityViolationException: Hibernate operation: could not execute query; ..... Caused by: java.sql.SQLException: ORA-01722: invalid number 我实在不明白为什么会报这个错误,难道Hibernate在set date或者set string之前不会对其进行格式的转换吗?于是我又换了另外一个HQL语句,在代码里面提前将Date格式成String,但还是报错: where to_char(dateType,'yyyy-mm-dd hh24:mi') = :strDate 后来实在没办法了,用了一阴招,代码如下,测试通过,但是觉得这种代码太丑陋了。 [code="java"] public List<Job> getJobByDate(final Date jobDate, final String dateType) { return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session)throws HibernateException { String strDate = DateUtil.convertDateToString(jobDate, "yyyy-MM-dd HH:mm"); Query query = session.createQuery("from Job job where " + "to_char(" + dateType + ",'yyyy-mm-dd hh24:mi') = '" + strDate + "'"); return (List<Job>) query.list();} });} [/code] 不知道各位能否解析一下上面那个报错的原因,谢谢先了!
java用jacob生成word文件
在生成word文件的时候,单个可以生成,批量生成的时候,就会报错表格需要的集合不存在,我的for循环是正常的。 ``` public ActionForward exportWord(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //这部分主要是获取前台数据 String bpId = request.getParameter("bpId") == null ? "" : request.getParameter("bpId"); String[] ids = request.getParameterValues("radio");//获取要申请id String zt = "仿宋_GB2312"; request.getSession().setAttribute("proName", false); StringBuffer qiId = new StringBuffer(); try { qiId.append(" from QualityInfo where 1=1"); qiId.append(" and id in ( "); // 查询施工人员数据 for(int i = 0 ;i<ids.length ; i++){ String workid = ids[i]; if( i != ids.length -1){ qiId.append("'"+workid+"' , "); }else{ qiId.append("'"+workid+"' )"); } } //这是生成前八行需要的数据,后边的行数是动态生成的 List<QualityInfo> qualityInfo = (List<QualityInfo> )commonService.find(qiId.toString());//获取检修计划单个信息 // 从这里开始创建表格 WordOperator wo = new WordOperator(false); wo.createNewDocument(); wo.setParagraphsProperties(1, 0, 0, 0, 0);//设置段落格式,不设置 自动左对齐,现在居中对齐。 wo.setFont(true, false, false, null, "16", zt);// 红1,0,0,0白16,77,72,15,这是设置字体样式的。 wo.insertText("泉州石化检修质量验收记录表"); wo.nextLine(); wo.moveDown(1); //获取每个表的设备名称 //获取生产运行部 List<Department> dyList = (List<Department>)PublicTools.getAllDYList(); String dyName=""; //获取装置 List<Department> zzList = (List<Department>)PublicTools.getAllZz(); String zzName=""; //开始往word表格内填写数据 if(qualityInfo != null && qualityInfo.size()!=0){ for(int i=0;i<qualityInfo.size();i++){ //获取每个表格的检查标准个数,为自动生成列做准备 String countSql="select count(id) cou from psjx_qualityinspectionplan where qfid='"+qualityInfo.get(i).getId()+"'"; List countList = commonService.getJDBC(countSql); Map countMap = (Map)countList.get(0); String countQl = countMap.get("cou").toString(); int countTotal = Integer.parseInt(countQl); String deviceName=PublicTool.deviceType(qualityInfo.get(i).getDeviceName()); if(zzList!=null && zzList.size()!=0){ for(int d=0;d<zzList.size();d++){ if(zzList.get(d).getDepartmentId().equals(qualityInfo.get(i).getProcessUnits())){ zzName=zzList.get(d).getDepartmentName(); } } } if(dyList!=null && dyList.size()!=0){ for(int d=0;d<dyList.size();d++){ if(dyList.get(d).getDepartmentId().equals(qualityInfo.get(i).getBuildingUser())){ dyName=dyList.get(d).getDepartmentName(); } } } //表格 //第一行 wo.setFont(false, false, false, null, "10", zt);//设置当前选定内容的字体,设置表格内的文字样式 wo.createTable("table" + i + 1, 12, 8 +(countTotal));//创建表格,位置,列数,行数 wo.mergeCell(i+1, 1, 1, 1, 2);//动态生成的时候,每次到这里就会报错。 wo.mergeCell(i+1, 1, 2, 1, 11); wo.putTxtToCell(i+1, 1, 2, "中化泉州石化有限公司管理体系"); wo.moveDown(1);//换行 //第二行 wo.mergeCell(i+1, 2, 1, 2, 2); wo.mergeCell(i+1, 2, 1, 1, 1); wo.mergeCell(i+1, 2, 2, 2, 11); wo.putTxtToCell(i+1, 2, 2, deviceName+"质量验收记录表"); wo.moveDown(1);//换行 //第三行 wo.mergeCell(i+1, 3, 1, 3, 2);//第三行的第一列和第二列合并, wo.mergeCell(i+1, 3, 1, 1, 1); wo.putTxtToCell(i+1, 3, 2, "记录编号");//第三行的第二列写入 wo.mergeCell(i+1, 3, 3, 3, 5);//第三行的第三列到第五列合并 wo.putTxtToCell(i+1, 3, 3, qualityInfo.get(i).getRecordNumber()== null?"":qualityInfo.get(i).getRecordNumber());//第三行的第三列写入 wo.mergeCell(i+1, 3, 4, 3, 5); wo.putTxtToCell(i+1, 3, 4, "使用单位"); wo.mergeCell(i+1, 3, 5, 3, 8); wo.putTxtToCell(i+1, 3, 5, dyName); wo.moveDown(1);//换行 //第四行 wo.mergeCell(i+1, 4, 1, 4, 2); wo.putTxtToCell(i+1, 4, 1, "生产装置"); wo.putTxtToCell(i+1, 4, 2, zzName); wo.putTxtToCell(i+1, 4, 3, "设备位号/名称"); wo.mergeCell(i+1, 4, 4, 4, 7); wo.putTxtToCell(i+1, 4, 4, qualityInfo.get(i).getSbmcs() == null ? "" :qualityInfo.get(i).getSbmcs() ); wo.mergeCell(i+1, 4, 5, 4, 6); wo.putTxtToCell(i+1, 4, 5, "设备标识"); wo.mergeCell(i+1, 4, 6, 4, 7); wo.putTxtToCell(i+1, 4, 6, PublicTool.deviceType(qualityInfo.get(i).getDeviceNumber() == null?"":qualityInfo.get(i).getDeviceNumber())); wo.moveDown(1);//换行 //第五行 wo.mergeCell(i+1, 5, 1, 5, 2); wo.putTxtToCell(i+1, 5, 1, "检修内容简述"); wo.mergeCell(i+1, 5, 2, 5, 7); wo.putTxtToCell(i+1, 5, 2, qualityInfo.get(i).getSketch() == null ? "": qualityInfo.get(i).getSketch()); wo.mergeCell(i+1, 5, 3, 5, 4); wo.putTxtToCell(i+1, 5, 3, "检修类别"); wo.mergeCell(i+1, 5, 4, 5, 5); wo.putTxtToCell(i+1, 5, 4, PublicTool.deviceType(qualityInfo.get(i).getClassification() == null ? "" : qualityInfo.get(i).getClassification())); wo.moveDown(1);//换行 //第六行 wo.mergeCell(i+1, 6, 1, 6, 2); wo.putTxtToCell(i+1, 6, 1, "检修通知单号"); wo.putTxtToCell(i+1, 6, 2, qualityInfo.get(i).getInform() == null ?"": qualityInfo.get(i).getInform()); wo.putTxtToCell(i+1, 6, 3, "检修工单号"); wo.mergeCell(i+1, 6, 4, 6, 5); wo.putTxtToCell(i+1, 6, 4, qualityInfo.get(i).getWorkNumber() == null ?"": qualityInfo.get(i).getWorkNumber()); wo.mergeCell(i+1, 6, 5, 6, 7); wo.putTxtToCell(i+1, 6, 5, "检修开始结束时间"); wo.mergeCell(i+1, 6, 6, 6, 8); wo.putTxtToCell(i+1, 6, 6, DateUtil.getDate(DateUtil.getDateFromTs( qualityInfo.get(i).getBeginTime()))+"~"+DateUtil.getDate(DateUtil.getDateFromTs( qualityInfo.get(i).getEndTime()))); wo.moveDown(1);//换行 //第七行 wo.putTxtToCell(i+1, 7, 1, "序号"); wo.putTxtToCell(i+1, 7, 2, "检查项目"); wo.mergeCell(i+1, 7, 3, 7, 4); wo.putTxtToCell(i+1, 7, 3, "检查标准"); wo.putTxtToCell(i+1, 7, 4, "控制级别"); wo.putTxtToCell(i+1, 7, 5, "检查结果"); wo.mergeCell(i+1, 7, 6, 7, 9); wo.putTxtToCell(i+1, 7, 6, "检查确认人"); wo.putTxtToCell(i+1, 7, 7, "检查时间"); wo.putTxtToCell(i+1, 7, 8, "备注"); wo.moveDown(1);//换行 //第八行 wo.mergeCell(i+1, 8, 1, 7, 1); wo.mergeCell(i+1, 8, 2, 7, 2); wo.mergeCell(i+1, 8, 3, 8, 4); wo.mergeCell(i+1, 8, 3, 7, 3); wo.mergeCell(i+1, 8, 4, 7, 4); wo.mergeCell(i+1, 8, 5, 7, 5); wo.putTxtToCell(i+1, 8, 6, "施工单位"); wo.mergeCell(i+1, 8, 7, 8, 8); wo.putTxtToCell(i+1, 8, 7, "生产单元"); wo.putTxtToCell(i+1, 8, 8, "设备工程部"); wo.mergeCell(i+1, 8, 9, 7, 7); wo.mergeCell(i+1, 8, 10, 7, 8); wo.moveDown(1);//换行 //这里是自动生成的行 List Kzjblist = SysCodeConstant.getCodeList(SysCodeConstant.SBZLJCKZJB);//控制级别 String kzjb=""; List<QualityInspectionPlan> QualityInspectionPlanList = (List<QualityInspectionPlan>)commonService.find(" from QualityInspectionPlan where qfId = '"+qualityInfo.get(i).getId()+"' order by inspectionItem");//获取质量检修标准id集合 List<String> qaaIdList= new ArrayList<String>(); if(QualityInspectionPlanList!= null && QualityInspectionPlanList.size()!=0){ for(int q=0; q<QualityInspectionPlanList.size();q++){ wo.putTxtToCell(i+1, 8+q+1, 1, q+1+""); wo.putTxtToCell(i+1, 8+q+1, 2, QualityInspectionPlanList.get(q).getInspectionItem()==null ? "":QualityInspectionPlanList.get(q).getInspectionItem() ); wo.mergeCell(i+1, 8+q+1,3 , 8+q+1, 4); wo.putTxtToCell(i+1, 8+q+1, 3, QualityInspectionPlanList.get(q).getInspectionStandard()==null?"":QualityInspectionPlanList.get(q).getInspectionStandard()); if( Kzjblist!=null && Kzjblist.size()>0 ){ for(int j=0;j<Kzjblist.size();j++){ Map code=(Map)Kzjblist.get(j); String name = code.get("name").toString(); String value = code.get("value").toString(); if(QualityInspectionPlanList.get(q).getControlHierarchy() != null){ if(QualityInspectionPlanList.get(q).getControlHierarchy().equals(value)){ kzjb = name; } } } } wo.putTxtToCell(i+1, 8+q+1, 4, kzjb); wo.putTxtToCell(i+1, 8+q+1, 5, QualityInspectionPlanList.get(q).getCheckResult()==""?"":QualityInspectionPlanList.get(q).getCheckResult()); wo.putTxtToCell(i+1, 8+q+1, 6, QualityInspectionPlanList.get(q).getWorkUnit()==null?"":QualityInspectionPlanList.get(q).getWorkUnit()); wo.mergeCell(i+1, 8+q+1,7 , 8+q+1, 8); wo.putTxtToCell(i+1, 8+q+1, 7, QualityInspectionPlanList.get(q).getProcessUnits()==null?"":QualityInspectionPlanList.get(q).getProcessUnits()); wo.putTxtToCell(i+1, 8+q+1, 8, QualityInspectionPlanList.get(q).getProductionDepartment()==null ?"":QualityInspectionPlanList.get(q).getProductionDepartment()); if(QualityInspectionPlanList.get(q).getCheckTime()!=null){ wo.putTxtToCell(i+1, 8+q+1, 9, DateUtil.getDate(DateUtil.getDateFromTs( QualityInspectionPlanList.get(q).getCheckTime()))); }else{ wo.putTxtToCell(i+1, 8+q+1, 9, ""); } wo.putTxtToCell(i+1, 8+q+1, 10, QualityInspectionPlanList.get(q).getRemark()==null?"":QualityInspectionPlanList.get(q).getRemark()); wo.moveDown(1);//换行 } } wo.nextLine(); } } //下载 String path = ConfigUtil.getPropertyValueByName("FILE_PATH") + "\\泉州石化质量检修表.doc"; System.out.println("path="+path); wo.save(path); wo.close(); // path是指欲下载的文件的路径。 File file = new File(path); // 取得文件名。 String filename = file.getName(); // 取得文件的后缀名。 String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase(); // 以流的形式下载文件。 InputStream fis = new BufferedInputStream(new FileInputStream(path)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); // 清空response response.reset(); // 设置response的Header String fname = new String((filename ).getBytes(), "ISO-8859-1"); response.addHeader("Content-Disposition", "attachment;filename=" + fname); response.addHeader("Content-Length", "" + file.length()); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); toClient.write(buffer); toClient.flush(); toClient.close(); System.gc(); file.delete(); }catch (Exception e) { e.printStackTrace(); }finally{ request.getSession().setAttribute("proName", true); } return null; } ```
请教个jquery的问题,本人新手,怕描述不清,看图说话。
<p><br><img src="http://dl.iteye.com/upload/attachment/227335/330258b7-15f5-371c-a7d0-c05b8c9a9dfb.jpg" alt=""></p> <p>  上图是页面的部分效果,因为每次输入的的数据很多字段是重复的, 偶尔需要修改。 </p> <p>  我想做到得效果是在红圈处增加一个按钮,每点击下,在下面的表单初始化一新行,数据为该行上一行的数据。</p> <p>代码如下:</p> <pre name="code" class="js">&lt;html &gt; &lt;head&gt; &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt; &lt;!-- 引入JSCal2-1.7 --&gt; &lt;script language="JavaScript" src="/myproject/plugins/JSCal2-1.7/src/js/jscal2.js"&gt;&lt;/script&gt; &lt;script language="JavaScript" src="/myproject/plugins/JSCal2-1.7/src/js/lang/cn.js" charset="utf-8"&gt;&lt;/script&gt; &lt;link rel="stylesheet" type="text/css" href="/myproject/plugins/JSCal2-1.7/src/css/jscal2.css" /&gt; &lt;script type="text/javascript" src="/myproject/plugins/EventUtil/EventUtil.js"&gt;&lt;/script&gt; &lt;link rel="stylesheet" href="/myproject/plugins/slick.grid/css/slick.grid.css" type="text/css" media="screen" charset="gb2312" /&gt; &lt;link rel="stylesheet" href="/myproject/plugins/slick.grid/css/examples.css" type="text/css" media="screen" charset="gb2312" /&gt; &lt;link rel="stylesheet" href="/myproject/plugins/jquery-message/jquery.message.css" type="text/css" media="screen" charset="gb2312" /&gt; &lt;!-- 引入jQuery --&gt; &lt;script language="JavaScript" src="/myproject/plugins/jQuery/js/jquery-1.3.2.min.js"&gt;&lt;/script&gt; &lt;!-- 引入JSON --&gt; &lt;script language="JavaScript" src="/myproject/plugins/json/json2.js"&gt;&lt;/script&gt; &lt;!-- 引入Slick.Grid --&gt; &lt;script language="JavaScript" src="/myproject/plugins/slick.grid/js/firebugx.js"&gt;&lt;/script&gt; &lt;script language="JavaScript" src="/myproject/plugins/slick.grid/js/jquery.getScrollbarWidth.js"&gt;&lt;/script&gt; &lt;script language="JavaScript" src="/myproject/plugins/slick.grid/js/jquery.rule-1.0.1-min.js"&gt;&lt;/script&gt; &lt;script language="JavaScript" src="slick.editors.js"&gt;&lt;/script&gt; &lt;script language="JavaScript" src="/myproject/plugins/slick.grid/js/slick.grid.js"&gt;&lt;/script&gt; &lt;script language="JavaScript" src="/myproject/plugins/slick.grid/js/slick.globaleditorlock.js"&gt;&lt;/script&gt; &lt;script language="JavaScript" src="/myproject/plugins/validator/validator.js"&gt;&lt;/script&gt; &lt;!-- 引入jquery-message --&gt; &lt;script src="/myproject/plugins/jquery-message/jquery.message.js" type="text/javascript"&gt;&lt;/script&gt; &lt;style&gt; #result { background: white; outline: 1px; border: 1px solid gray; width:99%; height:400px; } &lt;/style&gt; &lt;script&gt; /////////////////////////////////////////////////////////////////////////// //////////////////////////////全局信息定义///////////////////////////////// //数据状态 var RAW = 0; //原始 var NEW = 1; //新增 var MODIFIED = 2; //被修改 var DELETED = 3; //删除 var G_PrevRow = -1; //前一工作行 var G_LastRow = -1; //最后提交的行 var G_IsModified = false;//文档状态 var G_IsReady = true; //工作行是否处理就绪 var G_Current = new Date();//当前时间 var G_GridData = [];//表格基础数据 var G_DeletedRows = [];//需要服务器提交行ID列表 var G_DeleteItemRowNumbers = [];//需要服务器提交行序号列表 var G_PositionList = []; &lt;#if position?exists&gt; &lt;#list position as item&gt; G_PositionList[G_PositionList.length]="${item.position}"; &lt;/#list&gt; &lt;/#if&gt; var G_Grid; var G_Columns = [ {id:"select", name:"&lt;center&gt;&lt;INPUT id='selectAll' type='checkbox' value='true' class='editor-checkbox' hideFocus&gt;&lt;/center&gt;", width:30, formatter:SelectCellFormatter}, {id:"persName", name:"姓名", field:"persName", editor:TextCellEditor, validator : requiredFieldValidator}, {id:"sex", name:"性别", field:"sex", editor:SexSelectCellEditor, validator : requiredFieldValidator}, {id:"nation", name:"民族", field:"nation", editor:TextCellEditor}, {id:"birthPlace", name:"籍贯", field:"birthPlace", editor:TextCellEditor}, {id:"birthday", name:"出生年月", field:"birthday", width:120,editor:DateCellEditor}, {id:"idCard", name:"工种", field:"idCard", editor:PositionSelectCellEditor, validator : requiredFieldValidator}, {id:"workTime", name:"参加工作时间", field:"workTime", width:120,editor:DateCellEditor, validator : requiredFieldValidator}, {id:"position", name:"职位", field:"position", editor:TextCellEditor}, {id:"joinOrg", name:"所在部门", field:"joinOrg", editor:TextCellEditor, validator : requiredFieldValidator}, {id:"joinTime", name:"加入本部门时间", field:"joinTime", width:120,editor:DateCellEditor}, {id:"political", name:"政治面貌", field:"political", editor:TextCellEditor}, {id:"education", name:"文化程度", field:"education", editor:TextCellEditor}, {id:"techHera", name:"技术等级", field:"techHera", editor:TextCellEditor}, {id:"address", name:"住址", field:"address", editor:TextCellEditor}, {id:"tel", name:"联系电话", field:"tel", editor:TextCellEditor} ]; var G_Options = { editable: true, enableAddRow: true, enableCellNavigation: true, asyncEditorLoading: false }; //////////////////////////////全局信息定义结束///////////////////////////////// /////////////////////////////////////////////////////////////////////////// //文档加载完成 $(function() { $("#query").click(function(){ if(G_IsModified) { if(!confirm("数据已经修改,要放弃修改吗?")) { return; } } initData(); query(); }); init(); $("#view").click(function(){ view(); }); $("#account").click(function(){ account(); }); $("#save").click(function(){ if(validateCurrentRow()) { //alert(JSON.stringify(G_GridData)); //commitDelete(G_DeletedRows); //commitUpdate(G_GridData); //commitAdd(G_GridData); } }); //删除所选 $("#delete").click(function(){ if(validateCurrentRow()) { //全部待删除记录行序号列表 var deleteItems = []; $(":input[name='item'][checked='true']").each(function(){ deleteItems[deleteItems.length] = $(this).attr("id"); }); //排序待删除行序号 deleteItems.sort(sortNumber); for(var i = deleteItems.length; i &gt;0; i--) { var rowNumber = deleteItems[i - 1]; var row = G_GridData[rowNumber]; if(NEW != row.flag) { G_DeletedRows[G_DeletedRows.length] = row.persId; G_DeleteItemRowNumbers[G_DeleteItemRowNumbers.length] = rowNumber; } else { G_Grid.removeRow(rowNumber); G_GridData.splice(rowNumber, 1); } } //向服务器提交删除请求 $.post("/myproject/cm/zyn/cm_perInfo/deleteBatch.action", { "queryCondition.items": JSON.stringify(G_DeletedRows) }, function(data){ G_DeletedRows.splice(0, G_DeletedRows.length); if(!data.result) { $().message(data.message + "&lt;a href='javascript:$().message(data.detail)'&gt;\&gt;\&gt;&lt;/a&gt;"); } else { $().message(data.message + "&lt;a href='javascript:$().message(data.detail)'&gt;\&gt;\&gt;&lt;/a&gt;"); //服务器响应删除成功后,删除表格中的实际数据 for(var i = 0; i &lt; G_DeleteItemRowNumbers.length; i++) { G_Grid.removeRow(G_DeleteItemRowNumbers[i]); G_GridData.splice(G_DeleteItemRowNumbers[i], 1); } } G_DeleteItemRowNumbers.splice(0, G_DeleteItemRowNumbers.length); G_Grid.resizeCanvas(); G_Grid.render(); }, "json" ); G_Grid.resizeCanvas(); G_Grid.render(); } }); }) //初始化全局控制数据 function initData() { G_PrevRow = -1; G_IsModified = false; G_Current = new Date() G_GridData = []; G_DeletedRows = []; G_DeleteItemRowNumbers = []; } //初始化页面 function init() { query(); } //批量提交更新记录 function commitUpdate(items) { var updateList = []; for(var i = 0; i &lt; items.length; i++) { if(items[i].flag == MODIFIED) { updateList[updateList.length] = items[i]; } } if(updateList.length &gt; 0) { $.post("/myproject/cm/zyn/cm_perInfo/updateBatch.action", { "queryCondition.items": encodeURIComponent(JSON.stringify(updateList)) }, function(data){ if(!data.result) { $().message(data.message.message); } else { items.splice(0, items.length); } }, "json" ); } } //批量提交新增记录 function commitAdd(items) { var newList = []; for(var i = 0; i &lt; items.length; i++) { if(items[i].flag == NEW) { newList[newList.length] = items[i]; } } alert(JSON.stringify(newList)); if(newList.length &gt; 0) { $.post("/myproject/cm/zyn/cm_perInfo/addBatch.action", { "queryCondition.items": encodeURIComponent(JSON.stringify(newList)) }, function(data){ if(!data.result) { alert(data.message); } else { items.splice(0, items.length); } }, "json" ); } } //提交删除操作 function commitDelete(items) { $.post("/myproject/cm/zyn/cm_perInfo/deleteBatch.action", { "queryCondition.items": JSON.stringify(items) }, function(data){ if(!data.result) { alert(data.message); } else { items.splice(0, items.length); } }, "json" ); } //按照当前条件查询 function query() { $.post("/myproject/cm/zyn/cm_perInfo/searchAllPer.action", { "queryCondition.page": 1, "queryCondition.startTime": $("#startTime").val(), "queryCondition.endTime": $("#endTime").val() }, function(data){ G_GridData = data; initDataState(G_GridData); if(G_Grid)G_Grid.destroy(); G_Grid = new SlickGrid($("#result"), G_GridData, G_Columns, G_Options); G_Grid.onValidationError = function(elem, validationResults, row, cell, cellInfo) { $().message(validationResults.msg); } //新增一行事件处理 G_Grid.onAddNewRow = function(cellInfo, value) { if(G_IsReady) { G_IsModified = true; var item = {persId : "-1", flag : NEW, persName : "", sex : "", nation : "", birthPlace : "", birthday : formatDate(G_Current), idCard : "", workTime : formatDate(G_Current), position : "", joinOrg : "", joinTime : formatDate(G_Current),political : "", education : "", techHera : "", address : "", tel : "" }; item[cellInfo.field] = value; data[data.length] = item; G_Grid.resizeCanvas(); G_Grid.render(); G_Grid.updateRow(data.length-1); } } //工作行变化事件处理 G_Grid.onSelectedRowsChanged = function(){ G_IsReady = false;//工作行处理开始 currentRow = G_Grid.getSelectedRows(); if(G_PrevRow != -1 &amp;&amp; G_GridData[G_PrevRow] &amp;&amp; G_PrevRow != currentRow[0]) { if(validateRow(G_Grid, G_PrevRow, G_GridData[G_PrevRow], G_Columns)) { G_IsReady = true; saveLastRow(); G_PrevRow = currentRow; } } else { G_IsReady = true; G_PrevRow = currentRow; } } //全部选择/取消 $("#selectAll").click(function(){ var state = $(this).attr("checked"); $("input[name='item']").each(function(){ $(this).attr("checked", state); }); }); }, "json" ); } //保存最近一行 function saveLastRow() { G_LastRow = G_PrevRow; var row = G_GridData[G_PrevRow]; if(row) { switch(row.flag) { case NEW: $.post("/myproject/cm/zyn/cm_perInfo/add.action", { "queryCondition.items": encodeURIComponent(JSON.stringify(row)) }, function(data){ G_IsModified = false; $().message(data.message); if(data.result) { G_GridData[G_LastRow].persId = data.detail; G_GridData[G_LastRow].flag = RAW; } }, "json" ); break; case MODIFIED: $.post("/myproject/cm/zyn/cm_perInfo/update.action", { "queryCondition.items": encodeURIComponent(JSON.stringify(row)) }, function(data){ G_IsModified = false; if(!data.result) { $().message(data.message); } else { $().message(data.message + "ddf" + "&lt;a href='javascript:$().message(data.detail)'&gt;xx&lt;/a&gt;"); G_GridData[G_LastRow].flag = RAW; } }, "json" ); break; default: break; } } } //为按钮校验当前行 function validateCurrentRow() { var result = true; G_Grid.commitCurrentEdit(); if(!validateRow(G_Grid, G_PrevRow, G_GridData[G_PrevRow], G_Columns)) { result = false; } return result; } //对row行进行有效性检验,失败后定位到失败cell function validateRow(grid, rowNumber, row, columnDef) { var result = true; if(columnDef &amp;&amp; rowNumber &gt; -1) { for(var i = 0; i &lt; columnDef.length; i++) { if(columnDef[i].validator &amp;&amp; columnDef[i].field) { var validationResults = columnDef[i].validator(row[columnDef[i].field]); if(!validationResults.valid) { var currentCellNode = grid.gotoCell(rowNumber, i); $(currentCellNode).addClass("invalid"); if (grid.onValidationError) grid.onValidationError(currentCellNode, validationResults, rowNumber, i, columnDef[i]); result = false; break; } } } } return result; } function sortNumber(a, b) { return a - b } function initDataState(data) { for(var i = 0; i &lt; data.length; i++) { data[i]["flag"] = RAW; } } //获取当前日期所处报表段的起始日期 function generateStartTime(current) { var year = current.getYear(); year = (year &lt; 1900) ? (1900 + year) : year; var month = current.getMonth() + 1; var day = 0; var segment = (current.getDate() - 1) / 5; segment = segment &gt; 5 ? 5 : Math.floor(segment); day = segment * 5 + 1; return year + "-" + month + "-" + day; } //获取当前日期所处报表段的结束日期 function generateEndTime(current) { var year = current.getYear(); year = (year &lt; 1900) ? (1900 + year) : year; var month = current.getMonth() + 1; var day = ""; var segment = (current.getDate() - 1) / 5; segment = segment &gt; 5 ? 5 : Math.floor(segment); day = segment * 5 + 5; return year + "-" + month + "-" + day; } //生成YY-MM-DD格式的日期字符串 function formatDate(date) { var year = date.getYear(); var month = date.getMonth() + 1; var day = date.getDate(); return year + "-" + month + "-" + day; } function view(){ window.self.location = "goSearch.action"; } function account(){ window.self.location = "goAccountPer.action"; } ///////////////////////检验函数//////////////////////////////////////////////// function requiredFieldValidator(value){ return isEmpty(value) ? {valid:false, msg:"不能为空"} : {valid:true, msg:null}; } &lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;#if output?exists&gt; &lt;form id="search"&gt; &lt;div class="title" align="center"&gt;&amp;nbsp;&amp;nbsp;煤质人员基本信息&lt;/div&gt; &lt;div class="toolbarTop"&gt; &lt;div id="tools"&gt; &lt;tr&gt; &lt;td width="50"&gt;&lt;input type="button" id="delete" value="删除"/&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;input type="button" id="view" value="查询"/&gt;&lt;/td&gt; &lt;td width="50"&gt;&lt;input type="button" id="account" value="生成台账"/&gt;&lt;/td&gt; &lt;/div&gt; &lt;div id="pagination" style="float : right;"&gt;&lt;/div&gt; &lt;/div&gt; &lt;/form&gt; &lt;div id="result"&gt;&lt;/div&gt; &lt;/#if&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p> </p>
Kafka实战(三) - Kafka的自我修养与定位
Apache Kafka是消息引擎系统,也是一个分布式流处理平台(Distributed Streaming Platform) Kafka是LinkedIn公司内部孵化的项目。LinkedIn最开始有强烈的数据强实时处理方面的需求,其内部的诸多子系统要执行多种类型的数据处理与分析,主要包括业务系统和应用程序性能监控,以及用户行为数据处理等。 遇到的主要问题: 数据正确性不足 数据的收集主要...
volatile 与 synchronize 详解
Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个执行的线程还是可以拥有一份拷贝,这样做的目的是加速程序的执行,这是现代多核处理器的一个显著特性),所以程序在执行过程中,一个线程看到的变量并不一定是最新的。 volatile 关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
GitHub开源史上最大规模中文知识图谱
近日,一直致力于知识图谱研究的 OwnThink 平台在 Github 上开源了史上最大规模 1.4 亿中文知识图谱,其中数据是以(实体、属性、值),(实体、关系、实体)混合的形式组织,数据格式采用 csv 格式。 到目前为止,OwnThink 项目开放了对话机器人、知识图谱、语义理解、自然语言处理工具。知识图谱融合了两千五百多万的实体,拥有亿级别的实体属性关系,机器人采用了基于知识图谱的语义感...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
微信支付崩溃了,但是更让马化腾和张小龙崩溃的竟然是……
loonggg读完需要3分钟速读仅需1分钟事件还得还原到昨天晚上,10 月 29 日晚上 20:09-21:14 之间,微信支付发生故障,全国微信支付交易无法正常进行。然...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估算问题,被称为费米问题,是以科学家费米命名的。为什么面试会问这种问题呢?这类问题能把两类人清楚地区分出来。一类是具有文科思维的人,擅长赞叹和模糊想象,它主要依靠的是人的第一反应和直觉,比如小孩...
27 个提升开发幸福度的 VsCode 插件
作者:Jsmanifest 译者:前端小智 来源:Medium Visual Studio Code(也称为VSCode)是一种轻量级但功能强大的跨平台源代码编辑器, 借助对TypeScript 和Chrome调试器等开发工具的内置支持,越来越多的开发都都喜欢使用它。 如果你正在寻找更多的好用的 VsCode 工具,那么这篇或许能够帮助你。以下是 2019年为 JS 开发者提供的26...
相关热词 c#中dns类 c#合并的excel c# implicit c#怎么保留3个小数点 c# 串口通信、 网络调试助手c# c# 泛型比较大小 c#解压分卷问题 c#启动居中 c# 逻辑或运算符
立即提问