【问题标题】:Parse digits from integer从整数解析数字
【发布时间】:2018-08-09 22:12:24
【问题描述】:

我需要创建一个函数,用颜色填充Rectangle。 方法是这样的

public void fillRect(Rectangle rect, int color)
{
    int red = color;
    int green = color;
    int blue = color;
    g.setColor(new Color(red, green, blue));
    g.fillRect(rect.getX(), rect.getY(), rect.getW(), rect.getH());
}

我想使用一个整数作为参数,例如200100150 这将导致红色值200(只有前三个数字)。

这个宽度java可以做吗?

【问题讨论】:

标签: java integer render rectangles


【解决方案1】:

你可以像这样使用 '%' 和 '/' 操作:

int blue = color % 1000;
color /= 1000;

int green = color % 1000;
color /= 1000;

int red = color;

你也可以在开头添加一个简单的验证

if(color <= 99_999_999) { // I'm pretty sure that you need at least JDK7 to use '_' notation
    //do sth
}

【讨论】:

  • 非常简洁的解决方案,不会弄乱数字甚至更糟:字符串类型的东西;-)
  • 为了验证,你不是说999_999_999吗? --- 更好的验证是检查这 3 个值是否为 0-255,因为颜色 256-999 无效。
  • @Andreas 不,我不是说 999_999_999,因为颜色的“最低”值可以是 100_000_000 ;) 但是你是对的,我的验证只是基本的(颜色 int 是否有 9 位) 并且需要对值范围进行额外检查
  • @m.antkowicz 我同意 Andreas 的观点,原因不同——如果红色、绿色和/或蓝色为零会怎样?例如,黑色将是 000000000 并且您的验证失败。最好检查解析的值。
  • @JonathanLam 你是对的,这是重要的边界情况,你需要检查 - 但仍然 - 将此 int 拆分为 3 部分并验证它们,你需要确保它有 9 位数字。所有这些只是让我认为将这种颜色作为一个长数字发送在设计上是不好的,有问题并且不容易支持:)
【解决方案2】:

如果您知道数字长度(即,看起来所有整数的长度都是 9),您可以使用模数和(整数)除法:

int red = color / 1000000;
int green = color % 1000000 / 1000;
int blue = color % 1000;

如果没有,可以把整数转成String,取前三个字符作为子串,再转回整数。

【讨论】:

  • 和我的想法一样,但我真的很喜欢你的符号风格:)
  • @m.antkowicz 是的,你刚刚打败了我!很高兴提到验证
  • 使用double 数学计算int 似乎违反直觉。写1000000 而不是1e6 并不难。 --- 您可以通过 before 应用运算符来执行 1e6 并保持 int 数学运算,例如int red = color / (int)1e6;,但是为什么,因为 (int)1e6 是 8 个字符,而 1000000 只有 7 个字符,所以你没有保存任何内容,而且我认为它的可读性也较差。
  • @Andreas 我的错!出于某种原因,我没有意识到使用指数表示法会产生double 值这一事实。我修好了。
【解决方案3】:

转换为字符串并获取子字符串并再次将它们转换为整数?好主意。这是我的代码

public void setColor(int color)
{
    String newColor = Integer.toString(color);
    g.setColor(new Color(Integer.parseInt(newColor.substring(0, 3)),
                         Integer.parseInt(newColor.substring(3, 6)),
                         Integer.parseInt(newColor.substring(6, 9))));
}

它会比将整数传递给 Color() 慢得多吗? 我是 Java 新手,我想按照自己的方式做事。

【讨论】:

  • 转换为字符串并返回是多余的,因为简单的除法和余数数学可以做到这一点。但更重要的是,如果您使用想要黑色,因为color = 0 变成了newColor = "0" 并且所有substring(...) 调用都会抛出IndexOutOfBoundsException,使得这个答案没有用。
  • 我找到了解决方案。我计算了字符串长度和数字 9 之间的差异,并使用 for 循环在 newColor 前面添加了一个 0。
猜你喜欢
  • 2019-11-28
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多