64位双精度可以精确地表示整数+/- 2 53
鉴于这一事实,我选择将double类型用作所有类型的单一类型,因为我的最大整数是无符号32位.
但现在我必须打印这些伪整数,但问题是它们也与实际双打混合在一起.
那么如何在Java中很好地打印这些双打?
我试过了String.format("%f", value),这很接近,除了我得到很多小值的尾随零.
这是一个示例输出 %f
232.00000000 0.18000000000 1237875192.0 4.5800000000 0.00000000 1.23450000
我想要的是:
232 0.18 1237875192 4.58 0 1.2345
当然,我可以编写一个函数来修剪这些零,但由于字符串操作,这会导致很多性能损失.我可以用其他格式代码做得更好吗?
编辑
Tom E.和Jeremy S.的答案是不可接受的,因为它们都可以任意舍入到小数点后两位.请在回答之前先了解问题.
编辑2
请注意,String.format(format, args...)是区域设置相关的(见下面的答案).
我真的没有看到UUID的观点.我知道碰撞的可能性实际上是零,但实际上零甚至几乎不可能.
有人可以举个例子,除了使用UUID之外别无选择吗?从我见过的所有用途中,我可以看到没有UUID的替代设计.当然设计可能稍微复杂一点,但至少它没有非零概率的失败.
UUID闻起来像全球变量.全局变量有许多方法可以实现更简单的设计,但它只是懒惰的设计.
JDK 8中的新功能允许您在保留二进制兼容性的同时添加到现有接口.
语法就像
public interface SomeInterface() {
void existingInterface();
void newInterface() default SomeClass.defaultImplementation;
}
Run Code Online (Sandbox Code Playgroud)
这种方式对于所有现有的实现,SomeInterface当它们升级到这个新版本时,它们并不会突然编译错误newInterface().
虽然这很简洁,但当你实现两个接口时会发生什么呢?两个接口都添加了一个你没有实现的新默认方法?让我举个例子来解释一下.
public interface Attendance {
boolean present() default DefaultAttendance.present;
}
public interface Timeline {
boolean present() default DefaultTimeline.present;
}
public class TimeTravelingStudent implements Attendance, Timeline {
}
// which code gets called?
new TimeTravelingStudent().present();
Run Code Online (Sandbox Code Playgroud)
这被定义为JDK 8的一部分了吗?
我发现Java神在这里谈论类似的东西http://cs.oswego.edu/pipermail/lambda-lib/2011-February/000068.html,但它是私人邮件列表的一部分,我不能直接问他们.
有关如何在JDK 8中使用默认值以及扩展Collection接口以支持lambdas的更多详细信息,请参阅此处:https: //oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdf
我使用JDBC连接到MySQL服务器(我认为没有连接池).在我的连接URL中autoReconnect=true
但我的联系仍然超时.我甚至检查过conn.isClosed()它的错误.但是当我尝试使用连接时,我得到以下异常.
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.net.SocketException MESSAGE: Software caused connection abort: socket write error STACKTRACE: java.net.SocketException: Software caused connection abort: socket write error ...
我知道在Java 1.6中你可以conn.isValid(0)用来检查连接,但我使用的是Java 1.5
有没有办法确保它没有超时?或者我将不得不升级到Java 1.6?
范围交叉是一个简单但非平凡的问题.
已经回答了两次:
第一个解决方案是O(n),第二个解决方案是数据库(当然小于O(n)).
我有同样的问题,但对于一个大的n,我不在数据库中.
这个问题似乎与存储2D点非常相似,可以快速检索矩形内的那些,但我看不到它是如何映射的.
那么你将数据结构存储在哪个数据结构中,以便搜索范围的成本低于O(n)?(使用可用于Java的库的额外功劳)
编辑:
我想获得所有相交范围的子集,这意味着搜索范围可以与多个范围相交.
Java中需要小于O(n)的方法是:
public class RangeSet {
....
public Set<Range> intersects(Range range);
....
}
Run Code Online (Sandbox Code Playgroud)
其中Range只是一个包含一对int start和end的类.
这不是一个不可能的问题,我已经有了解决方案,我只是想看看是否有更标准/更简单的方法
看完之后:清洁代码会谈 - 继承,多态和测试
我检查了我的代码并注意到一些switch语句可以重构为多态,但我也注意到我只使用带枚举的switch语句.这是否意味着枚举在OO设计中是"邪恶的",应该用多态性消除?
我有以下代码,显示我的错误或误解.
我发送了相同的列表,但修改了ObjectOutputStream.一次为[0],另一次为[1].但是当我读到它时,我得到[0]两次.我认为这是因为我发送的是同一个对象而ObjectOutputStream必须以某种方式缓存它们.
这是应该的工作,还是应该提交错误?
import java.io.*;
import java.net.*;
import java.util.*;
public class OOS {
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(new Runnable() {
public void run() {
try {
ServerSocket ss = new ServerSocket(12344);
Socket s= ss.accept();
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
List same = new ArrayList();
same.add(0);
oos.writeObject(same);
same.clear();
same.add(1);
oos.writeObject(same);
} catch(Exception e) {
e.printStackTrace();
}
}
});
t1.start();
Socket s = new Socket("localhost", 12344);
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
// outputs [0] … 我试图一次处理一个通过网络存储的文件.由于缓冲不是问题,因此读取文件很快.我遇到的问题只是列出文件夹中的目录.在许多文件夹中,每个文件夹至少有10k个文件.
由于File.list()返回数组而不是iterable,因此性能非常慢.Java关闭并收集文件夹中的所有名称,并在返回之前将其打包到数组中.
这个错误条目是http://bugs.sun.com/view_bug.do;jsessionid=db7fcf25bcce13541c4289edeb4?bug_id=4285834并且没有解决方法.他们只是说这已经为JDK7修复了.
几个问题:
我正在尝试像Database Design for Tagging这样的东西,除了我的每个标签都按类别分组.
例如,假设我有一个关于车辆的数据库.假设我们实际上并不太了解车辆,因此我们无法指定所有车辆将具有的列.因此,我们将用信息"标记"车辆.
1. manufacture: Mercedes
model: SLK32 AMG
convertible: hardtop
2. manufacture: Ford
model: GT90
production phase: prototype
3. manufacture: Mazda
model: MX-5
convertible: softtop
Run Code Online (Sandbox Code Playgroud)
现在您可以看到所有汽车都标有其制造和型号,但其他类别并不完全匹配.请注意,汽车只能拥有每个类别中的一个.IE浏览器.一辆汽车只能有一个制造商.
我想设计一个数据库来支持搜索所有梅赛德斯,或者能够列出所有制造商.
我目前的设计是这样的:
vehicles
int vid
String vin
vehicleTags
int vid
int tid
tags
int tid
String tag
int cid
categories
int cid
String category
Run Code Online (Sandbox Code Playgroud)
我有所有正确的主键和外键,除了我无法处理每辆车只能有一个制造商的情况.或者我可以吗?
我可以在vehicleTags中为复合主键添加外键约束吗?IE浏览器.我是否可以添加一个约束,使得复合主键(vid,tid)只能在vehicleTags中没有行时才添加到vehicleTags,这样对于同一个vid,还没有一个tid在同样的cid?
我的猜测是否定的.我认为这个问题的解决方案是向vehicleTags添加一个cid列,并创建新的复合主键(vid,cid).它看起来像:
vehicleTags
int vid
int cid
int tid
Run Code Online (Sandbox Code Playgroud)
这可以防止汽车有两个制造商,但现在我已经复制了tid在cid中的信息.
我的架构应该是什么?
在我之前的问题中,Tom在我的数据库模式中发现了这个问题,你如何做多对多表外连接?
编辑
我知道在示例制造中应该真的是车辆表中的一列,但是假设你不能这样做.这个例子只是一个例子.
我有3个表,foo,foo2bar和bar.foo2bar是foo和bar之间的多对多地图.这是内容.
select * from foo
+------+
| fid |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
select * from foo2bar
+------+------+
| fid | bid |
+------+------+
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 3 |
| 4 | 4 |
+------+------+
select * from bar
+------+-------+------+
| bid | value | zid |
+------+-------+------+
| 1 | 2 | 10 | …Run Code Online (Sandbox Code Playgroud) java ×6
sql ×2
algorithm ×1
architecture ×1
big-o ×1
closures ×1
double ×1
enums ×1
foreign-keys ×1
format ×1
interface ×1
io ×1
java-8 ×1
jdbc ×1
join ×1
many-to-many ×1
oop ×1
performance ×1
polymorphism ×1
schema ×1
search ×1
string ×1
tags ×1
timeout ×1
uuid ×1