按列从每个字符串中获取每个字符
Get each character from each string by column
我一直试图按列从每个字符串中获取每个字符,但我只获取了每个字符串的第一个字符,我想从每个字符串中按列获取每个字符。
例如:
我有来自 ArrayList of Strings 的三个字符串:
- 尺
- llo
- ut
我想要发生的事情必须是这样的,从字符串中按列获取每个字符后:
- 群
- hlt
- io
这么久,我当前的源代码只获取前两个字符串的第一个字符,即'cl',这是我当前的源代码:
List<String> New_Strings = new ArrayList<String>();
int Column_Place = 0;
for (String temp_str : Strings) {
try{ //For StringIndexOutOfBoundsException (handle last String)
if(Column_Place >= temp_str.length()){
Current_Character = temp_str.charAt(Column_Place);
New_Strings.add(Character.toString(Current_Character));
break;
}else if (Column_Place < temp_str.length()){
Current_Character = temp_str.charAt(Column_Place);
New_Strings.add(Character.toString(Current_Character));
}
}catch(Exception e){
continue;
}
Column_Place++;
}
您使用 enhanced/foreach 循环迭代列表。
所以你将在每个上迭代一次
细绳。而您的结果:只有第一个字母被处理。
您应该使用带有 as while
条件 while(Column_Place < Strings.size())
的 while
循环和这种方法。
或者作为替代方案,您可以分两个不同的步骤执行操作并使用 Java 8 个功能。
注意在Java中,变量以小写开头。请遵循约定,使您的代码在这里和那里更多 readable/understandable。
在 Java 8 中你可以这样做:
List<String> strings = new ArrayList<>(Arrays.asList("chi", "llo", "ut"));
int maxColumn = strings.stream()
.mapToInt(String::length)
.max()
.getAsInt(); // suppose that you have at least one element in the List
List<String> values =
// stream from 0 the max number of column
IntStream.range(0, maxColumn)
// for each column index : create the string by joining their
// String value or "" if index out of bound
.mapToObj(i -> strings.stream()
.map(s -> i < s.length() ? String.valueOf(
s.charAt(i)) : "")
.collect(Collectors.joining()))
.collect(Collectors.toList());
只需调用 groupByColumn(Arrays.asList("chi", "llo", "ut"):
public static List<String> groupByColumn(List<String> words) {
if (words == null || words.isEmpty()) {
return Collections.emptyList();
}
return IntStream.range(0, longestWordLength(words))
.mapToObj(ind -> extractColumn(words, ind))
.collect(toList());
}
public static String extractColumn(List<String> words, int columnInd) {
return words.stream()
.filter(word -> word.length() > columnInd)
.map(word -> String.valueOf(word.charAt(columnInd)))
.collect(Collectors.joining(""));
}
public static int longestWordLength(List<String> words) {
String longestWord = Collections.max(words, Comparator.comparing(String::length));
return longestWord.length();
}
您正在将各个字符的字符串表示形式添加到结果字符串中。相反,您应该将这些字符累积到结果字符串中。例如:
int numStrings = strings.size();
List<String> result = new ArrayList<>(numStrings);
for (int i = 0; i < numStrings; ++i) {
StringBuilder sb = new StringBuilder();
for (String s : strings) {
if (i < s.length) {
sb.append(s.charAt(i));
}
}
result.add(sb.toString());
}
只需将列表视为二维数组即可。从列表中拆分每个项目,从每个项目中获取第 j 个字符,当且仅当项目的长度大于索引 j 时。
ArrayList<String> list = new ArrayList<String>();
list.add("chi");
list.add("llo");
list.add("ut");
int size = list.size();
int i=0, j=0,k=0;
while(size-- > 0){
for(i=0; i<list.size(); i++){
String temp = list.get(i);
if(j < temp.length()){
System.out.print(temp.charAt(j));
}
}
j++;
System.out.println();
}
我一直试图按列从每个字符串中获取每个字符,但我只获取了每个字符串的第一个字符,我想从每个字符串中按列获取每个字符。
例如:
我有来自 ArrayList of Strings 的三个字符串:
- 尺
- llo
- ut
我想要发生的事情必须是这样的,从字符串中按列获取每个字符后:
- 群
- hlt
- io
这么久,我当前的源代码只获取前两个字符串的第一个字符,即'cl',这是我当前的源代码:
List<String> New_Strings = new ArrayList<String>();
int Column_Place = 0;
for (String temp_str : Strings) {
try{ //For StringIndexOutOfBoundsException (handle last String)
if(Column_Place >= temp_str.length()){
Current_Character = temp_str.charAt(Column_Place);
New_Strings.add(Character.toString(Current_Character));
break;
}else if (Column_Place < temp_str.length()){
Current_Character = temp_str.charAt(Column_Place);
New_Strings.add(Character.toString(Current_Character));
}
}catch(Exception e){
continue;
}
Column_Place++;
}
您使用 enhanced/foreach 循环迭代列表。
所以你将在每个上迭代一次
细绳。而您的结果:只有第一个字母被处理。
您应该使用带有 as while
条件 while(Column_Place < Strings.size())
的 while
循环和这种方法。
或者作为替代方案,您可以分两个不同的步骤执行操作并使用 Java 8 个功能。
注意在Java中,变量以小写开头。请遵循约定,使您的代码在这里和那里更多 readable/understandable。
在 Java 8 中你可以这样做:
List<String> strings = new ArrayList<>(Arrays.asList("chi", "llo", "ut"));
int maxColumn = strings.stream()
.mapToInt(String::length)
.max()
.getAsInt(); // suppose that you have at least one element in the List
List<String> values =
// stream from 0 the max number of column
IntStream.range(0, maxColumn)
// for each column index : create the string by joining their
// String value or "" if index out of bound
.mapToObj(i -> strings.stream()
.map(s -> i < s.length() ? String.valueOf(
s.charAt(i)) : "")
.collect(Collectors.joining()))
.collect(Collectors.toList());
只需调用 groupByColumn(Arrays.asList("chi", "llo", "ut"):
public static List<String> groupByColumn(List<String> words) {
if (words == null || words.isEmpty()) {
return Collections.emptyList();
}
return IntStream.range(0, longestWordLength(words))
.mapToObj(ind -> extractColumn(words, ind))
.collect(toList());
}
public static String extractColumn(List<String> words, int columnInd) {
return words.stream()
.filter(word -> word.length() > columnInd)
.map(word -> String.valueOf(word.charAt(columnInd)))
.collect(Collectors.joining(""));
}
public static int longestWordLength(List<String> words) {
String longestWord = Collections.max(words, Comparator.comparing(String::length));
return longestWord.length();
}
您正在将各个字符的字符串表示形式添加到结果字符串中。相反,您应该将这些字符累积到结果字符串中。例如:
int numStrings = strings.size();
List<String> result = new ArrayList<>(numStrings);
for (int i = 0; i < numStrings; ++i) {
StringBuilder sb = new StringBuilder();
for (String s : strings) {
if (i < s.length) {
sb.append(s.charAt(i));
}
}
result.add(sb.toString());
}
只需将列表视为二维数组即可。从列表中拆分每个项目,从每个项目中获取第 j 个字符,当且仅当项目的长度大于索引 j 时。
ArrayList<String> list = new ArrayList<String>();
list.add("chi");
list.add("llo");
list.add("ut");
int size = list.size();
int i=0, j=0,k=0;
while(size-- > 0){
for(i=0; i<list.size(); i++){
String temp = list.get(i);
if(j < temp.length()){
System.out.print(temp.charAt(j));
}
}
j++;
System.out.println();
}