Java中最常用的方法是验证转换long为int不会丢失任何信息?
这是我目前的实施:
public static int safeLongToInt(long l) {
int i = (int)l;
if ((long)i != l) {
throw new IllegalArgumentException(l + " cannot be cast to int without changing its value.");
}
return i;
}
Run Code Online (Sandbox Code Playgroud) 序幕
我正在尝试在通知上添加计时器.计时器是一项服务.每一行调用此行(继续Thread是一个"running"布尔值,timeString是精心设计的String,显示时间):
NotificationChrono.updateNotification(getApplicationContext(), continueThread,
NOTIF_ID, timeString, "Chronometer", notificationManager);
Run Code Online (Sandbox Code Playgroud)
这是NotificationChrono类:
public class NotificationChrono {
static public void updateNotification(Context context, boolean running,
int id, String title, String text,
NotificationManager notificationManager) {
Intent stopIntent = new Intent("com.corsalini.david.barcalc.STOP");
PendingIntent stopPendingIntent = PendingIntent.getBroadcast(context,
0, stopIntent, 0);
Intent startIntent = new Intent(
"com.corsalini.david.barcalc.STARTPAUSE");
PendingIntent startPendingIntent = PendingIntent.getBroadcast(context,
0, startIntent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(
context)
.setContentText(context.getString(R.string.notif_text))
.setContentTitle(title)
.setSmallIcon(R.drawable.ic_action_alarm_2)
.setAutoCancel(false)
.setOngoing(running)
.setOnlyAlertOnce(true)
.setContentIntent(
PendingIntent.getActivity(context, 10, new Intent(
context, FrontActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), 0))
.addAction(
running ? R.drawable.ic_action_pause
: …Run Code Online (Sandbox Code Playgroud) 我有一个专门研究两个参数的多方法:
(defmulti get-tag-type (fn [type tag] [type tag]))
Run Code Online (Sandbox Code Playgroud)
拥有该类型允许我将不同的defmethod调用分组:
(defmethod get-tag-type [::cat 0] [type tag] ::tiger)
(defmethod get-tag-type [::cat 1] [type tag] ::lion)
(defmethod get-tag-type [::cat 2] [type tag] ::jaguar)
(defmethod get-tag-type [::dog 0] [type tag] ::poodle)
(defmethod get-tag-type [::dog 1] [type tag] ::australian-shepherd)
(defmethod get-tag-type [::dog 2] [type tag] ::labrador-retriever)
Run Code Online (Sandbox Code Playgroud)
但是,有时候,我想要一个catch all或默认为其中一个组,如果没有其他组匹配则会调用它们:
(defmethod get-tag-type [::dog :default] ::mutt)
Run Code Online (Sandbox Code Playgroud)
但是,除非tag实际上这不起作用:default.
有什么好办法来实现这个目标?
我想更改我的emacs源代码主题.他们在emacswiki中说我必须在我的加载路径中的目录中添加.el文件,但是我的加载路径是什么?我该如何访问它?
这是一个关于 NSTableView 的 UI 行为最佳实践的问题。
我有一个 NSTableView,其内容偶尔会刷新。用户可以选择表中的无行、一行或多行。刷新数据时,可以删除某些行或重新排序。NSTableView 的默认行为似乎是保持选择相同的行索引,无论数据如何重新排序(我理解这种行为,因为 NSTableView 如何知道行移动到哪里?)
我可以更改此行为以在重新加载数据后修改选择,以便用户的原始选择保持选中状态,即使它们已移动。这将更改所选的行索引,因此也可能会让用户感到不舒服。
苹果对这种情况有什么要说的或者有标准行为吗?
我正在尝试重构一个类和一组子类,其中M类型确实扩展了任何东西,即使我们知道它必须是某种类型的子类.该类型是参数化的,我希望它的参数化类型可用于已经具有M值的子类.
有没有办法定义这个类,而不必在参数列表中包含冗余的K和V泛型类型.我希望能够让编译器从子类映射到的M中推断它们.
public abstract class NewParametrized<K, V, M extends SomeParametrized<K, V>> {
public void someMethodThatTakesKAndV(K k1, V v1) { }
}
Run Code Online (Sandbox Code Playgroud)
换句话说,我希望类声明看起来像:
public class NewParametrized<M extends SomeParametrized<K, V>> {
Run Code Online (Sandbox Code Playgroud)
K和V的类型将从M.的定义推断出来.
对于我的应用程序,我有一个自定义实现SharedPreferences.
在API级别9中,apply方法已添加到SharedPreferences.Editor界面中.
但是,VerifyError如果我将该方法添加到我的实现并尝试使用它,Android 1.6会抛出一个.
以向后兼容的方式使这项工作的最佳方法是什么?
编辑:
我应该澄清我的难题.在我切换到目标Gingerbread之前,我的实现SharedPreferences.Editor没有包含该apply方法.切换目标后,由于我的实现中缺少该方法,因此停止编译.
添加该方法的实现修复了编译问题,但又添加了一个新问题:Android 1.6甚至不会加载该类,抛出一个VerifyError.即使我发现错误,我的自定义实现也永远不会加载到1.6.
到目前为止,我最好的想法是使我自己的接口与SharedPreferences和SharedPreferences.Editor相同,并实现它们.当然,这需要在整个代码中进行彻底的更改,所以我尽量避免使用它.
我正在尝试确定什么会降低我的应用程序的性能,我正在研究什么是垄断主线程.
我刚刚发现Looper.setMessageLogging并正在设置客户Printer以查看主线程的使用方式:
Looper.getMainLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "MainLooper")) {
private long startTime = 0L;
@Override
public void println(String x) {
if (x.startsWith(">")) {
startTime = System.nanoTime();
} else if (x.startsWith("<")) {
final long duration = System.nanoTime() - startTime;
x += " (" + (duration / 1000000L) + " ms)";
}
super.println(x);
}
});
Run Code Online (Sandbox Code Playgroud)
这让我发现,是的,有很多代码需要超过500毫秒,有些代码需要几秒钟,这可能是性能如此糟糕的原因.
D/MainLooper( 1542): >>>>> Dispatching to Handler{433ae6a0} null: 1000
D/MainLooper( 1542): <<<<< Finished to Handler{433ae6a0} null (952 ms)
Run Code Online (Sandbox Code Playgroud)
现在,我只能理解这些日志消息了.我不知道在主线程上采用952 ms的方法是什么.有没有更好的方法来确定花费这么长时间的方法?
我希望下面的表达式返回一些结果,每个结果由两个cons单元组成,其中两个cons单元不相等.但是,它返回0结果.为什么我没有结果?
(run* [c1 c2]
(fresh [lx ly x1 y1 x2 y2]
(== lx [1 2])
(== ly [4 5])
(membero x1 lx)
(membero x2 lx)
(membero y1 ly)
(membero y2 ly)
(conso x1 y1 c1)
(conso x2 y2 c2)
(!= c1 c2)))
Run Code Online (Sandbox Code Playgroud)
预期结果的例子:
[(1 . 4) (2 . 5)][(1 . 4) (1 . 5)][(2 . 4) (2 . 5)]我不希望它返回一个结果,比如[(1 . 4) (1 . 4)]每个缺点中的两个点都相等.
如果我删除该(!= c1 c2)部分,我会得到16个结果,包括两个缺点相同的结果.
如果我更换(!= c1 c2),我会得到我期望的结果:
(conde …Run Code Online (Sandbox Code Playgroud) 寻找一些正则表达式的帮助.我正在寻找一种Java方法,用文字分割一些输入文本,但也保留分隔符(空格,标点符号).另一种方法是将单词拆分为自己的索引,其他非单词字符可以放在数组的其他索引中.
这个输入文字:
"Hello, this isn't working!"
Run Code Online (Sandbox Code Playgroud)
应该放入这样的数组:
{"Hello", ",", "this", "isn't", "working", "!"}
Run Code Online (Sandbox Code Playgroud)
要么
{"Hello", ", ", "this", " ", "isn't", " ", "working", "!"}
Run Code Online (Sandbox Code Playgroud)
我用Python做了基本相同的事情:
def split_input(string):
return re.findall(r"[\w']+|[\s.,!?;:-]", string)
Run Code Online (Sandbox Code Playgroud)
但我还没有找到一种在Java中完成同样事情的方法.我尝试String.split()过前瞻/后视,我尝试过模式匹配,但运气不好.
任何帮助将非常感激!
android ×3
java ×3
clojure ×2
casting ×1
cocoa ×1
elisp ×1
emacs ×1
generics ×1
hig ×1
multimethod ×1
nstableview ×1
performance ×1
regex ×1