gpt4 book ai didi

java - 需要使用集合按名称和十六进制值对颜色进行排序

转载 作者:行者123 更新时间:2023-12-01 13:20:21 28 4
gpt4 key购买 nike

我正在尝试编写一个程序,该程序从输入文件中读取并按十六进制值对颜色进行配对。例如:黑色 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com