这是我的第一个问题。
我需要做一个返回特定字符串序列的函数,例如:
第一次通话返回“a” 第二个电话返回“b”, 第3次通话返回“c” 第4个回复“a” 第5次通话返回“a” 第6次通话返回“b” 第7次通话返回“b” 第8次通话返回“c” 第9次调用返回“c”等(序列是a,b,c - a,a,b,b,c,c - a,a,a,b,b,b,c,c,c等)
该函数必须只返回特定的字符串,所以如果我通过执行“println(magicFunction())”调用该函数2次;两次,它必须在第一次调用时返回“a”,在第二次调用时返回“b”。
以下是我在Java中尝试做的事情。
public class Main {
static int repetitions = 1;
static int said = 0;
static int cursor = 0;
static String[] list= {"a", "b", "c"};
public static void main(String[] args) {
for (int i = 0; i < 15; i++)
System.out.println(nextStr());
}
public static String nextStr() {
if (said >= repetitions ) {
cursor++;
said = 0;
} else {
said ++;
}
if (cursor == 2 && said == repetitions ) {
cursor = 0;
}
return list[cursor];
}
}
答案 0 :(得分:1)
我认为这将实现您的目标。
cursor
从0
开始,如果queried == queryLetter
则增加1。
queried == queryLetter
时,queried
重置为0
。
如果cursor == characters.length
然后按queryLetter
增加1
。
public class CharSource {
private int cursor = 0;
private int queryLetter = 1;
private int queried = 0;
private char[] characters = new char[]{'a', 'b', 'c'};
public static void main(String[] args) {
CharSource source = new CharSource();
for (int i=0; i<40; i++) {
System.out.println(source.get());
}
}
public char get() {
char result = characters[cursor];
if (++queried == queryLetter) {
if (++cursor == characters.length) {
cursor = 0;
queryLetter++;
}
queried = 0;
}
return result;
}
}
答案 1 :(得分:0)
这是一个非常长的流来生成序列:
Stream<Character> stream = IntStream.range(0, Integer.MAX_VALUE)
.mapToObj(i -> i)
.flatMap(i -> IntStream.rangeClosed(0, i/3).mapToObj(j -> (char)('a' + i % 3)));
打印前100个元素:
stream.limit(100).forEach(System.out::println);
生成
最大元素数量,如果这还不够,您可以随时切换到LongStream
。