java – 仅在匹配阈值字节时填充映射中的字符串值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 仅在匹配阈值字节时填充映射中的字符串值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3389字,纯文字阅读大概需要5分钟。
内容图文
![java – 仅在匹配阈值字节时填充映射中的字符串值](/upload/InfoBanner/zyjiaocheng/822/4e937b69e89d457c9b0193a716c099e9.jpg)
我有一个任务列表对象,我正在迭代并将每个任务对象附加到StringBuilder后跟新行,如下所示.现在我将继续在同一个字符串生成器中追加任务对象,直到它达到60000字节的大小限制.一旦达到限制,我将填充此字符串作为映射中的值,键将是带增量索引的文件名.然后我将重置字符串构建器和其他东西并再次重复此过程.
因此,如果我有一个大任务对象,那么我将拆分成多个字符串对象,其大小应始终小于60000字节.
我得到了下面的代码,但我总是看到地图中的值大小超过60000字节.我做错了什么?此外,我在两个不同的地方填充HashMap – 一个达到限制,另一个是如果未达到限制.
public void populate(final List<Task> tasks) {
Map<String, String> holder = new HashMap<>();
int size = 0;
int index = 0;
StringBuilder sb = new StringBuilder();
for (Task task : tasks) {
sb.append(task).append(System.getProperty("line.separator"));
size = sb.toString().getBytes(StandardCharsets.UTF_8).length;
if (size > 60000) {
String fileName = "tasks_info_" + index + ".txt";
holder.put(fileName, sb.toString());
index++;
sb = new StringBuilder();
size = 0;
}
}
// for cases where we don't reach the limit
if(sb.toString().length > 0) {
String fileName = "tasks_info_" + index + ".txt";
holder.put(fileName, sb.toString());
}
System.out.println(holder);
}
注意:如果每个Task对象超过60000字节,那么我将立即删除该对象并移至下一个条目.但实际上,它不会发生.
更新:
public void populate(final List<Task> tasks, final long timestamp) {
Map<String, String> holder = new HashMap<>();
int size = 0;
int index = 0;
int nl = System.getProperty("line.separator").getBytes(StandardCharsets.UTF_8).length;
StringBuilder sb = new StringBuilder();
// new change
sb.append(timestamp).append(System.getProperty("line.separator"));
for (Task task : tasks) {
int ts = String.valueOf(task).getBytes(StandardCharsets.UTF_8).length;
if (size + ts + nl > 60000) {
String fileName = "tasks_info_" + index + ".txt";
holder.put(fileName, sb.toString());
index++;
sb = new StringBuilder();
// new change
sb.append(timestamp).append(System.getProperty("line.separator"));
size = 0;
}
sb.append(task).append(System.getProperty("line.separator"));
size += ts + nl;
}
// for cases where we don't reach the limit
if (size > 0) { // size can only be 0 if you have 0 tasks
String fileName = "tasks_info_" + index + ".txt";
holder.put(fileName, sb.toString());
}
System.out.println(holder);
}
解决方法:
其他答案已经提到了它不起作用的原因(在它已经超过限制之后添加).但我认为到目前为止没有一个实现是正确的,不仅因为新行的大小被省略了.
public Map<String, String> populate(final List<Task> tasks) {
Map<String, String> holder = new HashMap<>();
if (tasks.size() == 0)
return holder;
int index = 0;
int nl = System.getProperty("line.separator").getBytes(StandardCharsets.UTF_8).length;
StringBuilder sb = new StringBuilder();
sb.append(System.currentTimeMillis()).append(System.getProperty("line.separator"));
int size = sb.toString().getBytes(StandardCharsets.UTF_8).length;
for (Task task : tasks) {
int ts = String.valueOf(task).getBytes(StandardCharsets.UTF_8).length;
if (size + ts + nl > 60000) {
String fileName = "tasks_info_" + index + ".txt";
holder.put(fileName, sb.toString());
index++;
sb = new StringBuilder();
sb.append(System.currentTimeMillis()).append(System.getProperty("line.separator"));
size = sb.toString().getBytes(StandardCharsets.UTF_8).length;
}
sb.append(task).append(System.getProperty("line.separator"));
size += ts + nl;
}
String fileName = "tasks_info_" + index + ".txt";
holder.put(fileName, sb.toString());
return holder;
}
内容总结
以上是互联网集市为您收集整理的java – 仅在匹配阈值字节时填充映射中的字符串值全部内容,希望文章能够帮你解决java – 仅在匹配阈值字节时填充映射中的字符串值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。