在 Java 中延迟创建彩色地图
Lazily create a colour map in Java
我创建了一个函数来在 java 中创建颜色图。
final void setDefaultColourMap() {
colourMap = new HashMap<>();
colourMap.put(0, Color.BLACK);
colourMap.put(1, Color.RED);
colourMap.put(2, Color.GREEN);
colourMap.put(3, Color.BLUE);
colourMap.put(4, Color.PINK);
colourMap.put(5, Color.YELLOW);
colourMap.put(6, Color.CYAN);
colourMap.put(7, Color.ORANGE);
colourMap.put(8, Color.MAGENTA);
colourMap.put(9, Color.DARK_GRAY);
colourMap.put(10, Color.WHITE);
colourMap.put(11, Color.GRAY);
colourMap.put(12, Color.LIGHT_GRAY);
}
我想创建一个 java 流,当请求颜色时,它会生成一个新的随机数,并 return 懒惰地生成一个随机颜色。
类似于惰性列表。
编辑:
我读过函数式编程范式支持惰性列表。例如,有一个斐波那契数列的列表,该列表理论上存储列表中的所有元素,但实际上,会在请求时生成第 n 个元素。
我想用一些逻辑来模拟惰性色图。我生成的颜色图只有 13 种颜色的输入。我不想手动输入高达一百左右的值。
我想模拟一个懒人色图。因此,当我请求键为 35 的颜色时,colorMap 是用一些最多 35 的随机颜色制定的,第 35 个值是 returned。
我基本上可以 return 只有 35 并存储它,但理想情况下,如果访问 35,在我的扩展程序中,您可以假设存在最大 35 的值。
这是一个开始:
import java.awt.Color;
import java.util.HashMap;
import java.util.Random;
public class Main {
public static void main(String[] args) {
ColorMap map = new ColorMap();
System.out.println(map.get(19));
System.out.println(map.get(9));
System.out.println(map.get(9));
System.out.println(map.get(0));
for(int key : map.keySet()){
System.out.println(key);
}
}
}
class ColorMap extends HashMap<Integer, Color>{
Random rand = new Random();
@Override
public Color get(Object key){
if(! (key instanceof Integer)) return null;
Color color = super.get(key);
if(color == null){
color = makeRandomColor();
put((Integer) key,color);
}
return color;
}
private Color makeRandomColor(){
return new Color( rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
}
}
编辑: 要填充缺失值,您需要循环并检查所有先前值:
import java.awt.Color;
import java.util.HashMap;
import java.util.Random;
public class Main {
public static void main(String[] args) {
ColorMap map = new ColorMap();
System.out.println(map.get(19));
for(int key : map.keySet()){
System.out.println(key);
}
}
}
class ColorMap extends HashMap<Integer, Color>{
Random rand = new Random();
@Override
public Color get(Object key){
if(! (key instanceof Integer)) return null;
int positiveIntKey = Math.abs((Integer) key);
Color color = super.get(positiveIntKey);
if(color == null){
fillMapUpTo(positiveIntKey);
}
return super.get(positiveIntKey);
}
private void fillMapUpTo(Integer positiveIntKey) {
for(int key = 0; key <= positiveIntKey; key++){
if(super.get(key) == null){
put(key,makeRandomColor());
}
}
}
private Color makeRandomColor(){
return new Color( rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
}
}
我创建了一个函数来在 java 中创建颜色图。
final void setDefaultColourMap() {
colourMap = new HashMap<>();
colourMap.put(0, Color.BLACK);
colourMap.put(1, Color.RED);
colourMap.put(2, Color.GREEN);
colourMap.put(3, Color.BLUE);
colourMap.put(4, Color.PINK);
colourMap.put(5, Color.YELLOW);
colourMap.put(6, Color.CYAN);
colourMap.put(7, Color.ORANGE);
colourMap.put(8, Color.MAGENTA);
colourMap.put(9, Color.DARK_GRAY);
colourMap.put(10, Color.WHITE);
colourMap.put(11, Color.GRAY);
colourMap.put(12, Color.LIGHT_GRAY);
}
我想创建一个 java 流,当请求颜色时,它会生成一个新的随机数,并 return 懒惰地生成一个随机颜色。
类似于惰性列表。
编辑:
我读过函数式编程范式支持惰性列表。例如,有一个斐波那契数列的列表,该列表理论上存储列表中的所有元素,但实际上,会在请求时生成第 n 个元素。
我想用一些逻辑来模拟惰性色图。我生成的颜色图只有 13 种颜色的输入。我不想手动输入高达一百左右的值。
我想模拟一个懒人色图。因此,当我请求键为 35 的颜色时,colorMap 是用一些最多 35 的随机颜色制定的,第 35 个值是 returned。
我基本上可以 return 只有 35 并存储它,但理想情况下,如果访问 35,在我的扩展程序中,您可以假设存在最大 35 的值。
这是一个开始:
import java.awt.Color;
import java.util.HashMap;
import java.util.Random;
public class Main {
public static void main(String[] args) {
ColorMap map = new ColorMap();
System.out.println(map.get(19));
System.out.println(map.get(9));
System.out.println(map.get(9));
System.out.println(map.get(0));
for(int key : map.keySet()){
System.out.println(key);
}
}
}
class ColorMap extends HashMap<Integer, Color>{
Random rand = new Random();
@Override
public Color get(Object key){
if(! (key instanceof Integer)) return null;
Color color = super.get(key);
if(color == null){
color = makeRandomColor();
put((Integer) key,color);
}
return color;
}
private Color makeRandomColor(){
return new Color( rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
}
}
编辑: 要填充缺失值,您需要循环并检查所有先前值:
import java.awt.Color;
import java.util.HashMap;
import java.util.Random;
public class Main {
public static void main(String[] args) {
ColorMap map = new ColorMap();
System.out.println(map.get(19));
for(int key : map.keySet()){
System.out.println(key);
}
}
}
class ColorMap extends HashMap<Integer, Color>{
Random rand = new Random();
@Override
public Color get(Object key){
if(! (key instanceof Integer)) return null;
int positiveIntKey = Math.abs((Integer) key);
Color color = super.get(positiveIntKey);
if(color == null){
fillMapUpTo(positiveIntKey);
}
return super.get(positiveIntKey);
}
private void fillMapUpTo(Integer positiveIntKey) {
for(int key = 0; key <= positiveIntKey; key++){
if(super.get(key) == null){
put(key,makeRandomColor());
}
}
}
private Color makeRandomColor(){
return new Color( rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
}
}