英文:
sorting strings in an array by including a certain character with lambda -- using contains?
问题
我正在努力创建一个可以按照包含字母 "e" 的单词将字符串数组排序的方法(按照它们在原始顺序中相对于其他单词的顺序)。我在确定如何做到这一点方面遇到了问题。它似乎不允许使用 "contains()" 方法,我不明白为什么会这样。如果有人能告诉我,我会很感激。
这是我的代码,我的IDE告诉我 "contains" 方法未解析。
/**
* Sorts an array of Strings so that words that contain the letter 'e'
* appear before all the other words.
*
* @param words the array of strings to be sorted.
* @return a sorted array of Strings.
*/
public String[] sortByLetterE(String[] words) {
//创建新的 String[]
String[] eFirst = new String[words.length];
//收集包含 E/e 的字符串
eFirst.add(words.forEach(word -> {
word.contains('E') || word.contains('e');
}));
//收集其余部分
eFirst.add(words.forEach(word -> {
!word.contains('E') && !word.contains('e');
}));
//返回排序后的数组
return eFirst;
}
我也不完全清楚如何以这种方式对数组进行排序。在我的 "排序" 搜索中,我只找到了人们提供明显的 ".compareTo" 方法来按字母/数字顺序排序的示例,这在这里没有帮助。
英文:
I'm working on creating a method that sorts strings in an array, by putting all words that contain "e" up front (in their original order relative to each other). I'm having trouble determining a way to do this. It doesn't seem to allow ".contains()", and I don't understand why this is. I'd appreciate if anyone could tell me.
Here's my code, in which my IDE tells me the use of "contains" is unresolved.
/**
* Sorts an array of Strings so that words that contain the letter 'e'
* appear before all the other words.
*
* @param words the array of strings to be sorted.
* @return a sorted array of Strings.
*/
public String[] sortByLetterE(String[] words) {
//create new String[]
String [] eFirst = new String[words.length];
//collect strings that include E/e
eFirst.add(words.forEach(word -> {
word.contains('E') || word.contains('e');
}));
//collect the remainders
eFirst.add(words.forEach(word -> {
!word.contains('E') && !word.contains('e');
}));
//return sorted array
return eFirst;
}
I'm also not totally clear on how to sort an array in such a manner. All I'm finding in my "sorting" searches is people giving the obvious .compareTo to sort things alphabetically/numerically, which doesnt help here.
答案1
得分: 2
你可以只使用Arrays.sort()
与自定义比较器。Arrays.sort()
是稳定的,因此它将保持相等元素的顺序。这是示例代码:
import java.util.Arrays;
import java.util.Comparator;
public class test {
public static void main(String[] args){
String[] words = {"cat", "eel", "dog", "elephant"};
Arrays.sort(words, Comparator.comparingInt(a -> (a.contains("E") || a.contains("e") ? 0 : 1)));
for(String word : words)
System.out.println(word);
}
}
输出:
eel
elephant
cat
dog
英文:
You can just use Arrays.sort()
with a custom comparator. Arrays.sort()
is stable and as a result, it will preserve the order of equal elements. Here's example code:
import java.util.Arrays;
import java.util.Comparator;
public class test {
public static void main(String[] args){
String[] words = {"cat", "eel", "dog", "elephant"};
Arrays.sort(words, Comparator.comparingInt(a -> (a.contains("E") || a.contains("e") ? 0 : 1)));
for(String word : words)
System.out.println(word);
}
}
Output:
eel
elephant
cat
dog
答案2
得分: 1
不确定在这里进行排序是否是正确的方法。对于长列表来说,这可能会有点过度(当然,这个方法也可能有点过度)。
以下是基于包含 "e" 或不包含 "e" 的单词对它们进行分组的方法。单词在遇到时被映射,因此它们的相对顺序保持不变。然后将这两个列表连接在一起以获得最终结果。
String[] sorted = Arrays.stream(words)
.collect(Collectors.groupingBy(
w -> w.toLowerCase().contains("e") ? 0 : 1))
.values().stream().flatMap(List::stream)
.toArray(String[]::new);
for (String s : sorted) {
System.out.println(s);
}
输出结果
eel
elephant
cat
dog
英文:
Not certain that sorting is the proper way to go here. For long lists it could be overkill (of course, so could this).
The following groups the words based on containing an 'e' or not. The words are mapped as they are encountered so their relative order remains the same. The two lists are then concatenated to each other for the final result.
String[] sorted = Arrays.stream(words)
.collect(Collectors.groupingBy
w -> w.toLowerCase().contains("e") ? 0 : 1))
.values().stream().flatMap(List::stream)
.toArray(String[]::new);
for (String s: sorted) {
System.out.println(s);
}
Prints
eel
elephant
cat
dog
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论