所以我来自C背景(原来最初,虽然我已经有近5年没用过那种语言了)而且我正在尝试用Java中的字符串解析一些值.在CI中将使用sscanf.在Java中,人们告诉我"使用Scanner或StringTokenizer",但我看不出如何使用它们来实现我的目的.
我的输入字符串看起来像"17-MAR-11 15.52.25.000000000".CI会做类似的事情:
sscanf(thestring, "%d-%s-%d %d.%d.%d.%d", day, month, year, hour, min, sec, fracpart);
Run Code Online (Sandbox Code Playgroud)
但在Java中,我所能做的就是:
scanner.nextInt();
Run Code Online (Sandbox Code Playgroud)
这不允许我检查模式,对于"MAR"我最终不得不做以下事情:
str.substring(3,6);
Run Code Online (Sandbox Code Playgroud)
可怕!当然有更好的方法吗?
假设我有一个有两种方法的类,我不关心哪种被称为...
public class Foo {
public String getProperty(String key) {
return getProperty(key, null);
}
public String getProperty(String key, String defaultValue) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
以下(来自另一个类,仍然在我的应用程序中)应该通过我的测试:
public void thisShouldPass(String key) {
// ...
String theValue = foo.getProperty(key, "blah");
// ...
}
public void thisShouldAlsoPass(String key) {
// ...
String theValue = foo.getProperty(key);
if (theValue == null) {
theValue = "blah";
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
我不在乎调用哪个,我只想要调用两个变体中的一个.
在Mockito,我通常可以这样做:
Mockito.verify(foo, atLeastOnce()).getProperty(anyString());
Run Code Online (Sandbox Code Playgroud)
要么:
Mockito.verify(foo, atLeastOnce()).getProperty(anyString(), anyString());
Run Code Online (Sandbox Code Playgroud)
是否有一种本地方式可以说"验证其中一个或另一个至少发生过一次"?
或者我必须做一些粗暴的事情:
try {
Mockito.verify(foo, atLeastOnce()).getProperty(anyString());
} …Run Code Online (Sandbox Code Playgroud) 有时候(实际上很多)我们在Java中得到一个情况,其中两个对象指向同一个东西.现在,如果我们将这些单独序列化,则序列化表单具有对象的单独副本是非常合适的,因为它应该可以打开而不使用另一个.但是,如果我们现在对它们进行反序列化,我们发现它们仍然是分开的.有什么方法可以将它们联系在一起吗?
示例如下.
public class Example {
private static class ContainerClass implements java.io.Serializable {
private ReferencedClass obj;
public ReferencedClass get() {
return obj;
}
public void set(ReferencedClass obj) {
this.obj = obj;
}
}
private static class ReferencedClass implements java.io.Serializable {
private int i = 0;
public int get() {
return i;
}
public void set(int i) {
this.i = i;
}
}
public static void main(String[] args) throws Exception {
//Initialise the classes
ContainerClass test1 = new ContainerClass();
ContainerClass test2 …Run Code Online (Sandbox Code Playgroud) 我似乎多次遇到这个问题,我想问社区我是不是只是在咆哮错误的树.基本上我的问题可以归结为:如果我有一个值很重要的枚举(在Java中),我应该使用枚举还是有更好的方法,如果我使用枚举那么什么是反向查找的最佳方法吗?
这是一个例子.假设我想创建一个代表特定月份和年份的bean.我可能会创建如下内容:
public interface MonthAndYear {
Month getMonth();
void setMonth(Month month);
int getYear();
void setYear(int year);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我将我的月份存储为一个名为Month的单独类,因此它是类型安全的.如果我只是输入int,那么任何人都可以传入13或5,643或-100作为数字,并且在编译时无法检查它.我限制他们把一个月我将实现为枚举:
public enum Month {
JANUARY,
FEBRUARY,
MARCH,
APRIL,
MAY,
JUNE,
JULY,
AUGUST,
SEPTEMBER,
OCTOBER,
NOVEMBER,
DECEMBER;
}
Run Code Online (Sandbox Code Playgroud)
现在假设我有一些我想写的后端数据库,它只接受整数形式.那么标准的方法似乎是:
public enum Month {
JANUARY(1),
FEBRUARY(2),
MARCH(3),
APRIL(4),
MAY(5),
JUNE(6),
JULY(7),
AUGUST(8),
SEPTEMBER(9),
OCTOBER(10),
NOVEMBER(11),
DECEMBER(12);
private int monthNum;
public Month(int monthNum) {
this.monthNum = monthNum;
}
public getMonthNum() {
return monthNum;
}
}
Run Code Online (Sandbox Code Playgroud)
相当简单,但如果我想从数据库中读取这些值并编写它们会发生什么?我可以使用枚举中的case语句实现一个静态函数,它接受一个int并返回相应的Month对象.但这意味着如果我改变了什么,那么我将不得不改变这个函数以及构造函数参数 - 在两个地方改变.所以这就是我一直在做的事情.首先,我创建了一个可逆的地图类,如下所示:
public class ReversibleHashMap<K,V> extends java.util.HashMap<K,V> {
private …Run Code Online (Sandbox Code Playgroud) 我正在使用Flying Saucer将一些PDF文档从字符串渲染为XHTML.我的代码是这样的:
iTextRenderer.setDocument(documentGenerator.generate(xhtmlDocumentAsString));
iTextRenderer.layout();
iTextRenderer.createPDF(outputStream);
Run Code Online (Sandbox Code Playgroud)
我想要了解的是,当使用这种方法时,XHTML中的相对路径从哪里解决?例如,对于图像或样式表.我能够使用此方法成功生成基于文本的文档,但我需要了解如何引用我的图像和CSS.
Gmail似乎有一些聪明的方法来处理丰富的JS应用程序中的后退/前进按钮.
在我的组织中,我们试用了jQuery历史插件.该插件基本上每100毫秒运行一个函数,它解析URL并测试它是否已更改.HTTP锚点跟踪历史记录,如果锚点已更改,则插件调用用户指定的回调,传入新锚点,以便页面可以执行自定义行为以加载新内容.
我的组织确定jQuery历史插件不是生产质量.我并不怪他们说实话,因为你真的不想强迫你的用户的浏览器每100毫秒运行一次功能.此外,它使JS代码几乎不可能调试,因为在Firebug或类似的JS调试器中单击"Break On Next"将始终捕获jQuery历史事件,并且不会查看其他事件.
所以我们在这一点上放弃了在浏览器中实现后退/前进功能.但是,我最近注意到Gmail很好地实现了这一点.它还使用了HTTP锚点值,但我按下了"Break On Next",而且每100毫秒没有运行任何类型的功能.Gmail如何设法实现此后退/前进行为?
我有BufferedReader(生成new BufferedReader(new InputStreamReader(process.getInputStream()))).我对a的概念很陌生,BufferedReader但正如我所看到的,它有三种状态:
bufferedReader.readLine将立即返回此字符串. bufferedReader.readLine将挂起线程,直到一行可用. bufferedReader.readLine将返回null.现在我想确定状态BufferedReader,以便我可以确定是否可以安全地从中读取而不挂起我的应用程序.基本过程(见上文)众所周知是不可靠的,因此可能已经挂起; 在这种情况下,我不希望我的宿主应用程序挂起.因此我正在实施一种超时.我试图首先使用线程进行此操作,但它变得非常复杂.
呼叫BufferedReader.ready()不会区分上述情况(2)和(3).换句话说,如果ready()返回false,则可能是流刚刚关闭(换句话说,我的底层进程正常关闭),或者可能是底层进程挂起.
所以我的问题是:如何BufferedReader在不实际调用的情况下确定我所处的这三种状态中的哪一种readLine?不幸的是,我不能打电话readLine来检查这个,因为它打开我的应用程序挂起.
我使用的是JDK 1.5版.
许多资料来源都提到从类路径加载 ChromeDriver 二进制文件,但我还没有弄清楚如果二进制文件不在类路径根目录中如何执行此操作。
要指定二进制文件的路径,您似乎必须设置系统属性“webdriver.chrome.driver”。首先我尝试:
System.setProperty("webdriver.chrome.driver", "drivers/Chrome/chromedriver.exe");
Run Code Online (Sandbox Code Playgroud)
但我得到了一个错误,它似乎正在寻找该位置的驱动程序"C:\<working directory of my application process>\drivers\Chrome\chromedriver.exe"。这里的工作目录实际上是我的源代码存放的目录。
然后我尝试:
System.setProperty("webdriver.chrome.driver", "/drivers/Chrome/chromedriver.exe");
Run Code Online (Sandbox Code Playgroud)
然而同样的事情发生了——这次它正在寻找"C:\drivers\Chrome\chromedriver.exe"。
使用“webdriver.chrome.driver”属性或任何其他配置方式时,如何让 ChromeDriver 在类路径上查找 ChromeDriver 二进制文件?
我写了一个模型示例来说明这一点,而不会泄露任何机密信息.这是一个"虚拟"示例,它什么都不做,但问题发生在测试初始化器中.
@RunWith(Parameterized.class)
public class ExampleParamTest
{
int ordinal;
List<String> strings;
public ExampleParamTest(int ordinal, String... strings)
{
this.ordinal = ordinal;
if (strings.length == 0)
{
this.strings = null;
}
else
{
this.strings = Arrays.asList(strings);
}
}
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{0, "hello", "goodbye"},
{1, "farewell"}
});
}
@Test
public void doTest() {
Assert.assertTrue(true);
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我有一个测试构造函数,它接受本地列表变量的多个参数,我想通过数组初始化器填充它.测试方法将正确处理本地列表变量 - 我已删除此逻辑以简化测试.
当我写这篇文章时,我的IDE没有关于语法和测试类构建的抱怨而没有任何编译错误.但是,当我运行它时,我得到:
doTest[0]:
java.lang.IllegalArgumentException: wrong number of arguments
at java.lang.reflect.Constructor.newInstance(Unknown Source)
doTest[1]:
java.lang.IllegalArgumentException: argument type mismatch
at java.lang.reflect.Constructor.newInstance(Unknown …Run Code Online (Sandbox Code Playgroud) 所以假设我有:
String s = "1479K";
String t = "459LP";
Run Code Online (Sandbox Code Playgroud)
我想回来
String commonChars = "49";
Run Code Online (Sandbox Code Playgroud)
两个字符串之间的共同字符.
显然,可以使用标准循环,例如:
String commonChars = "";
for (i = 0; i < s.length; i++)
{
char ch = s.charAt(i);
if (t.indexOf(ch) != -1)
{
commonChars = commonChars + ch;
}
}
Run Code Online (Sandbox Code Playgroud)
但是我希望能够在一行中使用replaceAll.这可以按如下方式完成:
String commonChars = s.replaceAll("["+s.replaceAll("["+t+"]","")+"]","");
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否可以使用单个调用来执行此操作replaceAll?什么是正则表达式?我认为我必须使用某种前瞻性,但当我想到它时,我的大脑变得糊里糊涂.