小编AJM*_*eld的帖子

java中的<<或>>>是什么意思?

可能重复:
>>和>>>在Java中意味着什么?

我在一些java代码中遇到了一些不熟悉的符号,虽然代码编译和函数正确,但我很困惑尖括号在这段代码中做了什么.我在com.sun.java.help.search.BitBuffer中找到了代码,其片段如下:

public void append(int source, int kBits)
    {
        if (kBits < _avail)
        {
            _word = (_word << kBits) | source;
            _avail -= kBits;
        }
        else if (kBits > _avail)
        {
            int leftover = kBits - _avail;
            store((_word << _avail) | (source >>> leftover));
            _word = source;
            _avail = NBits - leftover;
        }
        else
        {
            store((_word << kBits) | source);
            _word = 0;
            _avail = NBits;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这些神秘的括号做什么?它几乎看起来像c ++插入/提取,但我知道Java没有这样的东西.

此外,我尝试谷歌搜索它,但由于某种原因谷歌似乎没有看到尖括号,即使我把它们放在引号中.

java syntax

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

合并两个流

我试图实现一个方法来合并两个Streams中的值基于a Comparator的值.

我有办法做到这一点,我迭代流并将值插入到一个Stream.Builder,但我还没有弄清楚如何制作一个懒惰评估版本(许多流操作的方式),所以它可以处理无限流.

我想要它做的就是对输入数据执行单个合并传递,而不是对流进行排序(实际上,流很可能是无序的;需要保留这种混乱).

static Stream<E> merge(Stream<E> first, Stream<E> second, Comparator<E> c)
Run Code Online (Sandbox Code Playgroud)

我如何懒惰地合并这样的两个流?

如果我用两个Queues作为输入,一些Consumer作为输出,这将是相当简单的:

void merge(Queue<E> first, Queue<E> second, Consumer<E> out, Comparator<E> c){
    while(!first.isEmpty() && !second.isEmpty()
        if(c.compare(first.peek(), second.peek()) <= 0)
            out.accept(first.remove());
        else
            out.accept(second.remove());
    for(E e:first)
        out.accept(e);
    for(E e:second)
        out.accept(e);
}
Run Code Online (Sandbox Code Playgroud)

但我需要使用惰性评估和流来完成这项工作.

为了解决这些评论,这里有一些示例输入和结果:

例1:

merge(
    Stream.of(1, 2, 3, 1, 2, 3),
    Stream.of(2, 2, 3, 2, 2, 2),
    Comparator.naturalOrder()
);
Run Code Online (Sandbox Code Playgroud)

将返回一个将产生此序列的流:

1, 2, 2, 2, 3, 3, 1, 2, …
Run Code Online (Sandbox Code Playgroud)

java merge java-8 java-stream

10
推荐指数
1
解决办法
7665
查看次数

在try/catch中捕获异常后继续执行循环

一旦在此代码中捕获到异常,该menuSystem方法就会运行,但是一旦我输入一个数字,程序就会关闭并显示"Build is successful"消息.一旦发生异常,有没有办法重新进入while循环?

public static void main(String[] args) {
   final UnitResults myUnit = new UnitResults(10, "Java");
   int option = menuSystem();

   try {
      while (option != 0) {
         final Scanner keyb = new Scanner(System.in);
         System.out.println("");
         switch (option) {
         }
      }
   } catch (Exception InputMismachException) {
      System.out.println("\nPlease Enter a Valid Number\n");
      option = menuSystem();
   }
}
Run Code Online (Sandbox Code Playgroud)

java try-catch while-loop

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

字母频率表,包括特殊字符?

有没有人知道某个地方的相关频率不仅仅是字母,还有标点符号/特殊字符?我需要使用该表来设置我的霍夫曼代码密钥生成算法的字母频率,但在超过半小时的谷歌搜索我找不到任何字母和特殊字符之间的比较(我找到了字母表,和我甚至找到一个只比较特殊字符,但没有什么可以相互比较).

character-encoding special-characters

7
推荐指数
0
解决办法
4122
查看次数

两个接口指定具有相同签名的方法,但指定具有不同的行为?

我有一些类public class myClass implements A, B,其中A和B都包含一个方法 public int doSomething();,但是A.doSomething由接口指定做一些不同的方法B.doSomething.

我已经读过两个接口,它们在Java类中实现了相同的方法签名,但这并没有真正解决我的问题,因为这些方法被重写来做同样的事情,但正如我上面所说,我的问题是关于何时指定它们做不同事情的接口.

例如,假设A.doSomething()应该返回0,而B.doSomething()应该抛出异常,并且违反任何一个wold会导致应该将它们作为参数的方法出现问题.

在java中有没有办法做到这一点?如果是这样,一个人怎么会这样做呢?

java

6
推荐指数
2
解决办法
2433
查看次数

通过来自其他结构成员的偏移指针访问struct成员是否合法?

在这两个示例中,通过偏移指向其他成员的指针来访问结构的成员是否会导致未定义/未指定/实现定义的行为?

struct {
  int a;
  int b;
} foo1 = {0, 0};

(&foo1.a)[1] = 1;
printf("%d", foo1.b);


struct {
  int arr[1];
  int b;
} foo2 = {{0}, 0};

foo2.arr[1] = 1;
printf("%d", foo2.b);
Run Code Online (Sandbox Code Playgroud)

第6.7.2.1段第14段似乎表明这应该是实施定义的:

结构或联合对象的每个非位字段成员以适合其类型的实现定义方式对齐.

然后继续说:

结构对象中可能存在未命名的填充,但不是在其开头.

但是,像下面这样的代码似乎很常见:

union {
  int arr[2];
  struct {
    int a;
    int b;
  };
} foo3 = {{0, 0}};

foo3.arr[1] = 1;
printf("%d", foo3.b);

(&foo3.a)[1] = 2; // appears to be illegal despite foo3.arr == &foo3.a
printf("%d", foo3.b);
Run Code Online (Sandbox Code Playgroud)

标准似乎保证foo3.arr是相同的&foo3.a,并且没有任何意义,指的是一种方式是合法的而另一种方式不是,但同样没有意义的是,添加外部联合与数组应该突然(&foo3.a)[1]法律. …

c struct pointers language-lawyer c11

6
推荐指数
1
解决办法
342
查看次数

我应该使用什么异常类型?

我正在编写一个执行矩阵运算的程序,我正在试图弄清楚在无效维度的情况下我应该使用什么样的代码.是否存在一些已经存在的异常类型,我的操作可以接受; 或者我应该实现自己的异常类型?我知道几乎任何异常类型都可以实现我想要的,但问题是确保异常实际上描述了导致它的问题.

java coding-style exception

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

Unicode 击键字符?

unicode 中是否有类似于由 组成的东西之类的字符?<kbd>HTML 中标签形成的字符?我想将它用作游戏的一部分来指示用户可以按某个键来执行特定操作,例如:

\n\n
\n

R重置,或S打开设置菜单。

\n
\n\n

有相应的字符吗?我不需要任何花哨的东西,比如\xe2\x87\xa7 ShiftTab \xe2\x87\x86,单字母键就足够了。我正在寻找一些类似于封闭字母数字的东西范围的东西。

\n\n

如果有相应的字符,我在哪里可以找到描述它们的页面?我尝试的所有谷歌搜索都只出现了“unicode字符键盘快捷键”的东西。

\n\n

如果没有相应的字符,我如何在处理 2.0.1 中将类似的内容显示为文本字符串的一部分(或至少与之一致)?

\n

keyboard unicode processing keystroke

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

调整大小时,`std::vector` 会抛出“错误分配”异常

我在 C++ dll 中有以下代码,通过 JNI 调用它:

std::vector<double> myVector;
myVector.resize(10000000, 0);
Run Code Online (Sandbox Code Playgroud)

我收到“错误分配”异常,即使向量的最大大小据称大于 10000000。

我应该使用什么工具来跟踪内存分配,以便找到任何内存泄漏?

如果确实没有内存泄漏,我如何减少向量的占用空间以确保我有足够的空间?

c++ java-native-interface stdvector bad-alloc

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

将偏移量添加到预分频硬件定时器时,如何避免这种逐个错误?

我正在写一个微控制器中断,需要为其中一个硬件定时器添加一个偏移量.但是,由于定时器预分频器的工作方式,根据相对于预分频器时钟的中断执行时序,原始方法可能会引入逐个错误.

ISR逐个错误的时序图

我在ATmega328P(= arduino)上使用定时器1.我使用/ 8预分频器在正常模式下进行设置,并使用定时器捕获中断来触发此操作; 中断的目标是在period触发输入捕获的事件之后将定时器设置为精确溢出(如果在另一个中断或其他禁用中断的情况下发生触发).

(我正在滥用PWM输出以在可变AC相位偏移处触发两个主电源光耦,而不需要在其上烧掉所有CPU时间;中断由电源相上的过零检测器触发.)

ISR的代码是这样的:

uint_16 period = 16667;

ISR(TIMER1_CAPT_vect){
    TCNT1 = TCNT1 - ICR1 - period + (elapsed counter ticks during execution);
}
Run Code Online (Sandbox Code Playgroud)

这里的临界区间TCNT1是读取时间和再次写入时间之间的临界间隔.

据我所知,没有办法直接读取预分频器的状态,所以我认为不可能只根据ISR时序应用不同的偏移量.

我可以在ISR(GTCCR |= _BV(TSM); GTCCR |= _BV(PSRSYNC); GTCCR &= ~_BV(TSM);)之前重置预分频器以进行同步,但这仍然会向定时器引入随机偏移,这取决于ISR时序.

我正在考虑的另一种方法是使用定时器来产生与预分频器同步的中断.我已经在定时器1上使用了两个输出比较寄存器,但是定时器0共享预分频器,因此可以使用它.但是,定时器中断执行可能最终被另一个中断或"cli"块延迟,因此无法保证工作.

如何编写中断以避免此错误?

c avr timer interrupt timing

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