以下将替换ASCII控制字符(简写为[\x00-\x1F\x7F]):
my_string.replaceAll("\\p{Cntrl}", "?");
Run Code Online (Sandbox Code Playgroud)
以下内容将替换所有ASCII不可打印字符(简写[\p{Graph}\x20]),包括重音字符:
my_string.replaceAll("[^\\p{Print}]", "?");
Run Code Online (Sandbox Code Playgroud)
但是,它们都不适用于Unicode字符串.有没有人有一个很好的方法从unicode字符串中删除不可打印的字符?
假设您有一个文本文件,如:
my_setting = ON
some_method = METHOD_A
verbosity = DEBUG
...
Run Code Online (Sandbox Code Playgroud)
您希望相应地更新相应的对象:
Setting my_setting = ON;
Method some_method = METHOD_A;
Verbosity verbosity = DEBUG;
...
Run Code Online (Sandbox Code Playgroud)
所有都是不同类型的枚举.
我想有一个通用的方法来实例化枚举值.也就是说,在运行时使用反射,并且事先不知道对象的枚举类型.
我会想象这样的事情:
for (ConfigLine line : lines)
{
String[] tokens = line.string.split("=", 2);
String name = tokens[0].trim();
String value = tokens[1].trim();
try
{
Field field = this.getClass().getDeclaredField(name);
if(field.getType().isEnum())
{
// doesn't work (cannot convert String to enum)
field.set(this, value);
// invalid code (some strange generics issue)
field.set(this, Enum.valueOf(field.getType().getClass(), value));
}
else
{ /*...*/ } …Run Code Online (Sandbox Code Playgroud) 在任何人对使用的事实提出质疑之前string.intern(),请允许我说在我的特定应用程序中出于内存和性能原因需要它.[1]
所以,直到现在我使用String.intern()并假设它是最有效的方法.但是,我注意到它已经成为软件的瓶颈.[2]
然后,就在最近,我试图String.intern()用一个巨大的地图替换我放置/获取字符串,以便每次获得一个唯一的实例.我预计这会慢一点......但恰恰相反!它速度非常快!intern()通过推动/轮询地图(实现完全相同)来替换,导致速度提高了一个数量级以上.
问题是:为什么intern()这么慢?!?那么为什么它不是简单地由地图(实际上只是一个定制的集合)备份而且速度会快得多?我很困惑.
[1]:对于不相信的人:它是在自然语言处理中并且必须处理千兆字节的文本,因此需要避免相同字符串的许多实例以避免炸毁内存和引用字符串比较足够快.
[2]:没有它(正常的字符串)是不可能的,有了它,这个特定的步骤仍然是计算密集程度最高的一步
编辑:
由于对这篇文章的惊人兴趣,这里有一些代码来测试它:
而实习结果超过100万字符串:
HashMap:4秒String.intern():54秒由于避免了一些预热/ OS IO缓存和类似的东西,通过颠倒两个基准的顺序重复实验:
String.intern():69秒HashMap:3秒如你所见,差异非常显着,超过十倍.(使用OpenJDK 1.6.0_22 64位...但使用太阳一个导致类似的结果我认为)
给定一个文件txt:
ab
a c
a a
Run Code Online (Sandbox Code Playgroud)
打电话时sort txt,我获得:
a a
ab
a c
Run Code Online (Sandbox Code Playgroud)
换句话说,它不是正确的排序,它有点删除/忽略空白!我希望这是行为,sort -i但无论是否有-i旗帜都会发生.
我想获得"正确"的排序:
a a
a c
ab
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
使用该-Xmx1G标志提供一千兆字节的堆,以下按预期工作:
public class Biggy {
public static void main(String[] args) {
int[] array = new int[150 * 1000 * 1000];
}
}
Run Code Online (Sandbox Code Playgroud)
该数组应代表约600 MB.
但是,以下抛出OutOfMemoryError:
public class Biggy {
public static void main(String[] args) {
int[] array = new int[200 * 1000 * 1000];
}
}
Run Code Online (Sandbox Code Playgroud)
尽管阵列应该代表大约800 MB,因此很容易适合内存.
丢失的记忆在哪里消失了?
我最近开始开发一个密集使用网络的应用程序.第一次使用RMI尝试,由于几个原因,我们切换到纯套接字.但是,当通过网络或甚至在localhost上测试套接字时,我们降低到25个请求/秒的速率.使用RMI时,它高出两个数量级.
通过更多测试,我们获得了以下(对于localhost):
这是客户端代码:(服务器端只回复"ACK")
public static void main(String[] args) throws IOException, ClassNotFoundException
{
Socket kkSocket = null;
ObjectOutputStream out = null;
ObjectInputStream in = null;
kkSocket = new Socket("barium", 4444);
out = new ObjectOutputStream(kkSocket.getOutputStream());
in = new ObjectInputStream(kkSocket.getInputStream());
long throughput;
long millis;
TcpRequest hello = null;
throughput = 0;
millis = System.currentTimeMillis();
while (System.currentTimeMillis() < millis + 1000)
{
hello = new TcpRequest();
hello.service = "hello";
hello.payload = Math.random();
throughput++;
}
System.out.println("-------------------------------------------------------");
System.out.println("| Objects created: " + (throughput) …Run Code Online (Sandbox Code Playgroud) 鉴于两个文件:
generic/scripts/hello.sh
parent/scripts -> generic/scripts
Run Code Online (Sandbox Code Playgroud)
parent/scripts/hello.sh从任何位置调用时,我希望(在脚本中)找到父目录的完整路径.在这种情况下parent.
主要问题是在unix 中parent/scripts/..引用generic.另一方面,涉及正则表达式的所有内容都不是通用的,可能容易出错.
解决方案不起作用:
`dirname $0`/..
realpath `dirname $0`/..
readlink -f `dirname $0`/..
`cd *something*/..; pwd`
`perl ... abs_path(...)`
Run Code Online (Sandbox Code Playgroud)
所有这些都将指向generic而不是parent因为象征性的联系.
涉及正则表达式的所有内容都不具有适应性/通用性,对于更复杂的路径可能会失败...路径中可能还有其他符号链接,你想要祖父,它是一个涉及的目录名..,你通过$ PATH调用它...
而且,我希望它在任何情况下都可以工作,即使它被称为通过$PATH.
这个简单问题的任何简单安全解决方案?我的意思是它毕竟只是获取父目录!
我用过的:
dir=$( dirname $( cd `dirname $0` >/dev/null; pwd ) )
Run Code Online (Sandbox Code Playgroud)
Dunno如果它是完美的但似乎表现得像预期的那样.
问题"规范":
这是圣诞节!你必须买礼物!
你有一套已经存在的玩具包,以及相应的捆绑价格:
1 0 0 1 0 1 1 1 0 => 58
0 1 0 0 1 1 1 0 0 => 27
1 1 1 0 0 0 1 0 0 => 46
0 0 0 0 1 1 1 1 0 => 73
...
Run Code Online (Sandbox Code Playgroud)
a 1表示玩具在捆绑中,而a 0表示不在捆绑中.
现在,圣诞老人促销即将到来,并X以"特别促销价"向您提供剩余的包.如果存在另一个捆绑包,我们会说这X是一个糟糕的交易Y:
编辑:为了更容易,我删除了条件3,但将条件1从"子集"更改为"严格子集"
X是一个严格的子集YX 比...更贵 Y目标是实现一种bool isBadSubset(X)能够有效地发现是否X好的功能.
鉴于存在数百万个捆绑包,将其与每个捆绑包进行比较显然是不可行的.此外,您可以假设在现有的捆绑集合中,玩具的子集总是比超集便宜.
提示:
我有一些关于ProcessBuilder的问题.该程序基本上是一个调用命令行脚本的简单包装器.
当通过终端自行运行脚本时,内存消耗保持在2G以下.通过java包装器运行脚本时,内存消耗会爆炸,甚至8G也会快速填满,从而导致内存不足错误.
启动该过程的代码很简单:
public static int execute(String command) throws IOException
{
System.out.println("Executing: " + command);
ProcessBuilder pb = new ProcessBuilder(command.split(" +"));
Process p = pb.start();
// display any output in stderr or stdout
StreamConsumer stderr = new StreamConsumer(p.getErrorStream(), "stderr");
StreamConsumer stdout = new StreamConsumer(p.getInputStream(), "stdout");
new Thread(stderr).start();
new Thread(stdout).start();
try {
return p.waitFor();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
StreamConsumer类只是一个消耗stdout/stderr流并在控制台上显示它们的类.
......问题是:为什么内存消耗会爆炸?
此致,
Arnaud
编辑:
Run Code Online (Sandbox Code Playgroud)sort big-text-file > big-text-file.sorted
根据Jim Garrison的要求编辑2:
好的,这是我省略的StreamConsumer类,因为它很简单:
class StreamConsumer …Run Code Online (Sandbox Code Playgroud) 那么,情况如下:
我必须阅读大的.gz档案(GB)和一种"索引"它们以后能够使用随机访问检索特定的部分.换句话说,我希望逐行读取存档,并能够获取文件中任何此类行的特定位置.(这样我可以根据要求直接跳到这些特定的位置).(PS:......它是UTF-8所以我们不能假设1个字节== 1个字符.)
所以,基本上,我只需要一个BufferedReader来跟踪它在文件中的位置.但是,这似乎并不存在.
有什么可用的或者我必须自己滚动吗?
一些额外的评论:
我想最好的是使用一种缓冲读取器来跟踪文件位置和缓冲区偏移...但这听起来非常麻烦.但也许我错过了什么.也许已经存在一些事情要做,一行一行地读取文件并跟踪位置(即使压缩).
谢谢你的提示,
阿尔诺
这应该是一个非常基本的问题.我想要一些HTML列表:
点击其中一个元素,下面会显示一些内容.例如,单击B时,我们获得:
我想有很多方法可以实现这一目标.我只想要最简单/最干净的方法.
谢谢,
Arnaud
正如标题中所述,我很想知道为什么Ruby决定放弃经典for循环而改为使用 array.each do ...
我个人觉得它的可读性稍差,但这只是我个人的看法.无需争论.另一方面,我认为他们是故意设计的,应该有一个很好的理由.
那么,以这种方式放置循环有什么好处?这个设计决定的"存在理由"是什么?