- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个程序,该程序从输入文件中读取并按十六进制值对颜色进行配对。例如:黑色 000000 就是一对。这是我到目前为止所拥有的:
public class HexColors{
public static void main(String[] args) throws IOException {
ArrayList <String> colorsArray = new ArrayList<String>();
Scanner hexColors = new Scanner(new File("input.txt"));
while (hexColors.hasNext()) {
colorsArray.add(hexColors.nextLine());
}
// Assuming I have to use a map to accomplish this.
Map<String, String> hexMap = new HashMap<String, String>();
System.out.println("Test" + hexMap);
System.out.print("The colors entered were:\n" );
for (Iterator<String> itr = colorsArray.iterator(); itr.hasNext();)
System.out.print(itr.next() + "\n");
Collections.sort(colorsArray);
System.out.println("The colors sorted by name are:");
for(String colorsSorted : colorsArray){
System.out.println(colorsSorted);
}
}
}
现在我让它按颜色的自然顺序显示,并且通过使用 collections.sort,我还让它们按字母顺序显示。这里重要的说明:我并不是在寻找完整的解决方案,只是在寻找下一步应该去哪里的一些指示。是否可以将 input.txt 中的输入存储为 Map?或者我应该以某种方式将 ArrayList 转换为 map ?感谢您的帮助。
最佳答案
如果您的输入文件每行包含一个颜色对,则使用 BufferedReader
逐行读取文件会更容易。 (请参阅 BufferedReader.readLine() ),然后分割每一行以提取颜色名称和十六进制值。
Reader reader = new BufferedReader(new FileReader("input.txt"));
String line;
while((line = reader.readLine()) != null) {
// Split line
// Add color name and hex value to your data structure
}
分割这样一条线的方法有很多种。例如。您可以使用String.split() 。或者您可以通过 String.indexOf() 搜索空格字符位置然后用String.substring()提取部分.
对于您的数据模型,也有很多替代方案。一个HashMap
可能是个好主意,因为您总是拥有映射到十六进制值的颜色名称。您确定文件中的每种颜色名称都是唯一的吗?
但仅使用 HashMap
您将丢失原始订单。更合适的数据结构是 LinkedHashMap
它内部使用双向链表来保留插入顺序。
所以有了 LinkedHashMap
您已完成第一个用例(原始订单)。迭代 LinkedHashMap
你就完成了。
迭代 Map
的最佳方法是使用entrySet() :
for(Entry<String, String> colorPair : map.entrySet()) {
String colorName = colorPair.getKey();
String colorHex = colorPair.getValue();
// Process colorName and colorHex ...
}
按字母顺序排列,您可以获得 map keySet() 的所有条目。并将它们放入 ArrayList
并使用Collections.sort()
。然后迭代 ArrayList
并通过 map 检索十六进制值。听起来有点复杂。但这是可行的。
但困难的部分是自然颜色顺序(您的意思是按十六进制值排序,对吧?)。所以你可以通过 Map.values() 获取所有颜色的十六进制值,对它们进行排序并...
您不能以相反的方式使用 map 。这里你想通过十六进制值检索颜色名称,但颜色名称是 map 的键。我假设您不想使用第三方库,并且 Java 的标准库中没有双向映射。
当然,您可以使用第二个恢复的 map ,但也许我们应该重新考虑一开始的选择,使用 map 作为数据模型。
更简单的方法是创建您自己的 ColorPair
类,然后使用一个简单的 ArrayList
保存所有颜色对。插入所有颜色对后,列表具有原始顺序。然后你可以使用Collections.sort()
按颜色名称排序,然后按颜色十六进制值排序。
这将是一个简单的 ColorPair
实现:
class ColorPair {
private String name;
private String hex;
public ColorPair(String name, String hex) {
this.name = name;
this.hex = hex;
}
public String getName() {
return name;
}
public String getHex() {
return hex;
}
@Override
public String toString() {
return String.format("[ColorPair name=%s, hex=%s]", name, hex);
}
}
您可以实现Comparable在这里界面并为您的 ColorPair
定义默认顺序实例。但是您想要两个不同的订单,因此您必须使用 Collections.sort()
的 Comparator 类反正。 (您可以尝试将其作为练习。)
假设你有一个方法 parseColorPair()
它获取输入文件的一行并返回 ColorPair
例如,您可以像这样读取文件:
Reader reader = new BufferedReader(new FileReader("input.txt"));
String line;
List<ColorPair> colorPairs = new ArrayList<ColorPair>();
while((line = reader.readLine()) != null) {
colorPairs.add(parseColorPair(line));
}
// Output in original order
for(ColorPair colorPair: colorPairs) {
System.out.println(colorPair); // using our custom ColorPair.toString() method
}
要按颜色名称对列表进行排序,您必须实现接口(interface) Comparator<ColorPair>
.
Collections.sort(colorPairs, new Comparator<ColorPair>() {
public int compare(ColorPair colorPair1, ColorPair colorPair2) {
// Compare the names of colorPair1 and colorPair2 and return
// a negative value, if colorPair1.getName() is lesser than colorPair2's name.
// return a positive value (greater than 0) if the first name is greater than
// the second name and return 0 if the names are equal.
// Hint: Look for String.compare()
}
});
您不能使用Collections.sort()
没有 Comparator
的版本在这里因为你的 ColorPair
类没有实现Comparable<ColorPair>
界面。
按十六进制值排序类似。 Comparator
实现的不同之处仅在于比较十六进制值而不是名称。
因此,使用正确的数据结构可以直接实现用例,但为给定问题找到正确的数据结构并非易事。
关于java - 需要使用集合按名称和十六进制值对颜色进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22073619/
我正在阅读 java swing,但在理解它时遇到问题。 Color 是一个类吗? Color[] col= {Color.RED,Color.BLUE}; 这在java中是什么意思? 最佳答案 Is
我正在研究用 python 编写的 pacman 程序。其中一个模块是处理吃 bean 游戏的图形表示。这当然是一些主机颜色。列表如下: GHOST_COLORS = [] ## establishe
本网站:http://pamplonaenglishteacher.com 源代码在这里:https://github.com/Yorkshireman/pamplona_english_teache
我最近将我的手机更新为 Android Marshmallow 并在其上运行了我现有的应用程序,但注意到颜色行为有所不同:将更改应用到 View (可绘制)的背景时,共享相同背景的所有 View (引
所有 X11/w3c 颜色代码在 Android XML 资源文件格式中是什么样的? I know this looks a tad ridiculous as a question, but giv
试图让 ffmpeg 创建音频波形,同时能够控制图像大小、颜色和幅度。我已经尝试过这个(以及许多变体),但它只是返回无与伦比的 "。 ffmpeg -i input -filter_complex "
我很好奇你是否有一些关于 R 中颜色酿造的技巧,对于许多独特的颜色,以某种方式使图表仍然好看。 我需要大量独特的颜色(至少 24 种,可能需要更多,~50 种)用于堆叠区域图(所以不是热图,渐变色不起
我看到的许多 WPF 示例和示例似乎都有硬编码的颜色。这些指南 - http://msdn.microsoft.com/en-us/library/aa350483.aspx建议不要硬编码颜色。在构建
我想更改文件夹的默认蓝色 如何设置? 最佳答案 :hi Directory guifg=#FF0000 ctermfg=red 关于Vim NERDTree 颜色,我们在Stack Overflow上
是否有关于如何将任意字符串哈希为 RGB 颜色值的最佳实践?或者更一般地说:3 个字节。 你问:我什么时候需要这个?这对我来说并不重要,但想象一下任何 GitHub 上的那些管图 network pa
我正在尝试将默认颜色设置为自定义窗口小部件。 这是有问题的代码。 class ReusableCard extends StatelessWidget { ReusableCard({this.
import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.Ta
我有一个 less 文件来定义一堆颜色/颜色。每个类名都包含相关颜色的名称,例如 .colourOrange{..} 或 .colourBorderOrange{..} 或 navLeftButtOr
我有一个RelativeLayout,我需要一个黑色背景和一个位于其中间的小图像。我使用了这段代码: 其中@drawable/bottom_box_back是: 这样我就可以将图像居中了。但背
我需要设置 浅色 的 JPanel 背景,只是为了不覆盖文本(粗体黑色)。 此刻我有这个: import java.util.Random; .... private Random random =
我正在尝试制作一个自定义文本编辑器,可以更改特定键入单词的字体和颜色。如何更改使用光标突出显示的文本的字体和/或颜色? 我还没有尝试过突出显示部分。我尝试获取整个 hEdit(HWND) 区域并更改字
我想改变我整个应用程序的颜色。 在我的 AndroidManfiest.xml 中,我有正确的代码: 在 values 文件夹中,我有 app_theme.xml: @style/MyAc
是否可以使用 android 数据绑定(bind)从 xml 中引用颜色? 这很好用: android:textColor="@{inputValue == null ? 0xFFFBC02D : 0
有没有办法在 Android 应用程序中设置“空心”颜色? 我的意思是我想要一个带有某种背景的框,而文本实际上会导致背景透明。换句话说,如果整个 View 在蓝色背景上,文本将是蓝色的,如果它是红色的
我用CGContextStrokePath画在白色背景图片中的一条直线上,描边颜色为红色,alpha为1.0画线后,为什么点不是(255, 0, 0),而是(255, 96, 96)为什么不是纯红色?
我是一名优秀的程序员,十分优秀!