根据字符串的模式数组对字符串进行排序



我需要按单词在模式数组中的顺序对字符串进行排序:

String[] pattern = {"Burger", "Fries", "Chicken", "Pizza", "Sandwich", "Onionrings", "Milkshake", "Coke"};
String s = "Chicken Coke Chicken Chicken Onionrings Coke Burger Milkshake Milkshake Burger Coke Milkshake Burger Onionrings Onionrings Coke Chicken Burger Fries Milkshake"; // input string

预计

"Burger Burger Burger Burger Fries Chicken Chicken Chicken Chicken Onionrings Onionrings Onionrings Milkshake Milkshake Milkshake Milkshake Coke Coke Coke Coke" // output string

您可以使用List从单词中获取索引,然后使用这些索引对单词进行排序

  • 获取单词的List以使其可索引
  • split将您的String放入一个数组中,以便能够对单词进行排序
  • sort基于它们在List中的索引
  • join得到一个String的单词
// INPUTS
String s = "Chicken Coke Chicken Chicken Onionrings Coke Burger Milkshake Milkshake Burger Coke Milkshake Burger Onionrings Onionrings Coke Chicken Burger Fries Milkshake";
String expect = "Burger Burger Burger Burger Fries Chicken Chicken Chicken Chicken Onionrings Onionrings Onionrings Milkshake Milkshake Milkshake Milkshake Coke Coke Coke Coke";
String[] pattern = {"Burger", "Fries", "Chicken", "Pizza", "Sandwich", "Onionrings",
"Milkshake", "Coke"};
// Get the patterns a list to get the indexOf method
List<String> listPatterns = Arrays.asList(pattern);
// Split in words
String[] values = s.split(" ");
//Sort base on index in list
Arrays.sort(values, Comparator.comparing(listPatterns::indexOf));
// Rebuild a string by joining
String result = String.join(" ", values);
// true
System.out.println(result.equals(expect));

由于问题不包含任何代码,我将只发布解决方案的粗略草图。

我会通过将String拆分成单词列表来解决这个问题,然后使用Comparator对这些单词进行排序,并用分隔空格将它们重新连接起来。

写入Comparators的一种常见方法是为相互比较的两个对象分配一个int-值,从另一个对象中减去一个,并将其作为比较结果返回。

Comparator中,我会使用pattern数组中相互比较的两个单词的索引作为比较的基础。

试试这个。

String[] pattern = {"Burger", "Fries", "Chicken", "Pizza", "Sandwich", "Onionrings", "Milkshake", "Coke"};
// make pattern to index map. {Burger=0, Fries=1, Chicken=2, ...}
Map<String, Integer> patternMap = IntStream.range(0, pattern.length).boxed()
.collect(Collectors.toMap(i -> pattern[i], Function.identity()));
// sort words using patternMap
String s = "Chicken Coke Chicken Chicken Onionrings Coke Burger Milkshake Milkshake Burger Coke Milkshake Burger Onionrings Onionrings Coke Chicken Burger Fries Milkshake"; // input string
String[] result = Arrays.stream(s.split("\s+"))
.sorted(Comparator.comparing(word -> patternMap.get(word)))
.toArray(String[]::new);
System.out.println(Arrays.toString(result));

输出:

[Burger, Burger, Burger, Burger, Fries, Chicken, Chicken, Chicken, Chicken, Onionrings, Onionrings, Onionrings, Milkshake, Milkshake, Milkshake, Milkshake, Coke, Coke, Coke, Coke]

这里有按字母顺序排列的代码

public class MainProgram {
public static void main(String[] args) {
String temp;
String[] pattern = {"Burger", "Fries", "Chicken", "Pizza", "Sandwich", "Onionrings", "Milkshake", "Coke"};
//Sorting the strings
for (int i = 0; i < pattern.length; i++) 
{
for (int j = i + 1; j < pattern.length; j++) { 
if (pattern[i].compareTo(pattern[j])>0) 
{
temp = pattern[i];
pattern[i] = pattern[j];
pattern[j] = temp;
}
}
}
//Displaying the strings after sorting them based on alphabetical order
System.out.print("Strings in Sorted Order:");
for (int i = 0; i <= pattern.length - 1; i++) 
{
System.out.print(pattern[i] + ", ");
}

}
}