Поиск ArrayList для определенного символа в строке
Каков правильный синтаксис для поиска ArrayList
строк для одного символа? Я хочу проверить каждую строку в массиве для одного символа. В конечном итоге я хочу выполнить множественный поиск и заменить все строки в массиве на основе наличия одного символа в строке. Я просмотрел java-examples.com и java docs, а также несколько методов поиска ArrayLists. Никто из них не делает то, что мне нужно. PS Любые указатели на использование какой-либо файловой библиотеки для выполнения нескольких поисков и замеров были бы замечательными.
--- Редактировать ---
В соответствии с рекомендациями arraylist
переработан, чтобы использовать простой тип string
. Это также сделало его совместимым с решением hoosssein, которое включено.
public void ArrayInput()
{
String FileName; // set file variable
FileName = fileName.getText(); // get file name
ArrayList<String> fileContents = new ArrayList<String>(); // create arraylist
try {
BufferedReader reader = new BufferedReader(new FileReader(FileName)); // create reader
String line = null;
while ((line = reader.readLine()) != null) {
if(line.length() > 0){ // don't include blank lines
line = line.trim(); // remove whitespaces
fileContents.add(line); // add to array
}
}
for (String row : fileContents) {
System.out.println(row); // print array to cmd
}
String oldstr;
String newstr;
oldstr = "}";
newstr = "!!!!!";
for(int i=0;i<fileContents.size();i++){
if(fileContents.contains(oldstr)){
fileContents.set(i, fileContents.get(i).replace(oldstr, newstr));
}
}
for (String row : fileContents) {
System.out.println(row); // print array to cmd
}
// close file
}
catch (IOException ex) { // E.H. for try
JOptionPane.showMessageDialog(null, "File not found. Check name and directory.");
}
}
сначала вам нужно перебрать список и выполнить поиск этого символа
string.contains("A");
для замены персонажа вам нужно иметь в виду, что String неизменен, и вы должны заменить новую строку старой строкой в этом списке
поэтому код подобен этому
public void replace(ArrayList<String> toSearchIn,String oldstr, String newStr ){
for(int i=0;i<toSearchIn.size();i++){
if(toSearchIn.contains(oldstr)){
toSearchIn.set(i, toSearchIn.get(i).replace(oldstr, newStr));
}
}
}
Для поиска и замены вам лучше использовать словарь, если вы знаете, что замените Hi
Hello
. Первый - это простой поиск, здесь с индексом и строкой, возвращаемой в Object [2], вам нужно будет отобразить результат. Он возвращает первое совпадение, вы не поняли это.
public static Object[] findStringMatchingCharacter(List<String> list,
char character) {
if (list == null)
return null;
Object[] ret = new Object[2];
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
if (s.contains("" + character)) {
ret[0] = s;
ret[1] = i;
}
return ret;
}
return null;
}
public static void searchAndReplace(ArrayList<String> original,
Map<String, String> dictionary) {
if (original == null || dictionary == null)
return;
for (int i = 0; i < original.size(); i++) {
String s = original.get(i);
if (dictionary.get(s) != null)
original.set(i, dictionary.get(s));
}
}
Вы можете попробовать это, измените по мере необходимости:
public static ArrayList<String> findInString(String needle, List<String> haystack) {
ArrayList<String> found = new ArrayList<String>();
for(String s : haystack) {
if(s.contains(needle)) {
found.add(s);
}
}
return found;
}
(для поиска char, просто myChar+""
и у вас есть строка)
Чтобы добавить функциональность find'n'replace, теперь вам будет довольно легко.
Здесь вариант для поиска String[]
:
public static ArrayList<String[]> findInString(String needle, List<String[]> haystack) {
ArrayList<String[]> found = new ArrayList<String[]>();
for(String fileLines[] : haystack) {
for(String s : fileLines) {
if(s.contains(needle)) {
found.add(fileLines);
break;
}
}
}
return found;
}
Вам не нужно дважды перебирать строки, чтобы делать то, что вам нужно. Вы можете выполнять замену при повторении файла.
Решение Java 8
try (BufferedReader reader = Files.newBufferedReader(Paths.get("pom.xml"))) {
reader
.lines()
.filter(x -> x.length() > 0)
.map(x -> x.trim())
.map(x -> x.replace("a", "b"))
.forEach(System.out::println);
} catch (IOException e){
//handle exception
}
Другой способ - использовать итератор
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Naman");
list.add("Aman");
list.add("Nikhil");
list.add("Adarsh");
list.add("Shiva");
list.add("Namit");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
if (next.startsWith("Na")) {
System.out.println(next);
}
}
}