小编Pyr*_*cal的帖子

如何很好地将浮动数字格式化为字符串而不必要的小数0?

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...)区域设置相关的(见下面的答案).

java string format floating-point double

472
推荐指数
15
解决办法
57万
查看次数

你什么时候真的被迫使用UUID作为设计的一部分?

我真的没有看到UUID的观点.我知道碰撞的可能性实际上,但实际上零甚至几乎不可能.

有人可以举个例子,除了使用UUID之外别无选择吗?从我见过的所有用途中,我可以看到没有UUID的替代设计.当然设计可能稍微复杂一点,但至少它没有非零概率的失败.

UUID闻起来像全球变量.全局变量有许多方法可以实现更简单的设计,但它只是懒惰的设计.

architecture uuid

116
推荐指数
9
解决办法
4万
查看次数

JDK 8中的默认值是Java中的多重继承形式吗?

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

java closures interface multiple-inheritance java-8

80
推荐指数
5
解决办法
2万
查看次数

为什么autoReconnect = true似乎不起作用?

我使用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?

java timeout jdbc

32
推荐指数
1
解决办法
5万
查看次数

范围交叉算法优于O(n)?

范围交叉是一个简单但非平凡的问题.

已经回答了两次:

第一个解决方案是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的类.

这不是一个不可能的问题,我已经有了解决方案,我只是想看看是否有更标准/更简单的方法

java algorithm big-o search interval-intersection

24
推荐指数
3
解决办法
2万
查看次数

我们应该总是支持多态性而不是枚举吗?

看完之后:清洁代码会谈 - 继承,多态和测试

我检查了我的代码并注意到一些switch语句可以重构为多态,但我也注意到我只使用带枚举的switch语句.这是否意味着枚举在OO设计中是"邪恶的",应该用多态性消除?

oop polymorphism enums

22
推荐指数
4
解决办法
5271
查看次数

在ObjectOutputStream上发送相同但已修改的对象

我有以下代码,显示我的错误或误解.

我发送了相同的列表,但修改了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] …

java io objectoutputstream

20
推荐指数
2
解决办法
4277
查看次数

是否有一种解决方法可以解决Java在行走大型目录时表现不佳的问题?

我试图一次处理一个通过网络存储的文件.由于缓冲不是问题,因此读取文件很快.我遇到的问题只是列出文件夹中的目录.在许多文件夹中,每个文件夹至少有10k个文件.

由于File.list()返回数组而不是iterable,因此性能非常慢.Java关闭并收集文件夹中的所有名称,并在返回之前将其打包到数组中.

这个错误条目是http://bugs.sun.com/view_bug.do;jsessionid=db7fcf25bcce13541c4289edeb4?bug_id=4285834并且没有解决方法.他们只是说这已经为JDK7修复了.

几个问题:

  1. 有没有人解决这个性能瓶颈问题?
  2. 我想要实现不可能吗?即使它只是遍历目录,性能仍然会变差吗?
  3. 我可以使用测试版JDK7构建具有此功能,而无需建立在它在我的整个项目?

java performance directory-walk

17
推荐指数
2
解决办法
1万
查看次数

如何设计数据库模式以支持使用类别标记?

我正在尝试像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在我的数据库模式中发现了这个问题,你如何做多对多表外连接?

编辑
我知道在示例制造中应该真的是车辆表中的一列,但是假设你不能这样做.这个例子只是一个例子.

sql tags schema foreign-keys entity-attribute-value

15
推荐指数
1
解决办法
1万
查看次数

你如何做很多表外连接?

我有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)

sql many-to-many join operator-precedence

14
推荐指数
2
解决办法
1万
查看次数