Java: Warum die Prüfung für "\n" nicht mit dem übereinstimmt, werden neue Zeilen Hinzugefügt mit dem System.getProperty(“line.separator")
(Aktualisiert, Frage)
Erste, ich denke, dass "\n"
entspricht System.getProperty("line.separator")
Schrieb ich einige Methoden zum arbeiten mit Strings, einige von Ihnen schauen auf die Existenz der neuen Linie
if (string.charAt(i) == '\n') {//do something;}
Aber ich bemerkte, dass die Prüfung für "\n"
nicht mit der neue Zeilen Hinzugefügt, indem die System.getProperty("line.separator")
Dies ist ein SSCCE zu demonstrieren, dass mein Anspruch!:
Beschreibung:
Zwei strings gleicher text; eine alpha_String
hat neue Linien Hinzugefügt, mit "\n"
, und die anderen beta_String
hat neue Linien Hinzugefügt, mit System.getProperty("line.separator")
Gibt es eine Methode mit dem Namen String removeExtraNewLines(String)
verwendet, um entfernen Sie alle zusätzlichen neuen Zeilen in ein String und wieder zurück, wie der header schon sagt. Die beiden strings gefiltert, diese Methode verwenden.
Den beiden Tasten buttonAlpha
und buttonBeta
jedem Satz den text der JTextArea
mit der gefilterten Zeichenfolge
Sie werden feststellen,, dass die Methode fangen/passen, und entfernen Sie zusätzliche neue Linien alpha_String
aber nicht tun das gleiche mit beta_String
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class NewLineTest extends JPanel
{
JPanel buttonPanel;
JPanel textAreaPanel;
JButton buttonAlpha;
JButton buttonBeta;
JTextArea textArea;
String n = "\n";
String s = System.getProperty("line.separator");
String alpha_String;
String beta_String;
public NewLineTest()
{
createSentencesText();
buttonAlpha = new JButton("Alpha String");
buttonAlpha.addActionListener(eventWatcher);
buttonBeta = new JButton("Beta String");
buttonBeta.addActionListener(eventWatcher);
textArea = new JTextArea(0, 0);
JScrollPane scrollTextArea = new JScrollPane(textArea);
scrollTextArea.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
textArea.setEditable(false);
buttonPanel = new JPanel();
textAreaPanel = new JPanel(new BorderLayout());
buttonPanel.add(buttonAlpha);
buttonPanel.add(buttonBeta);
textAreaPanel.add(scrollTextArea, BorderLayout.CENTER);
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, textAreaPanel, buttonPanel);
splitPane.setDividerLocation(400);
splitPane.setResizeWeight(.5d);
this.setLayout(new BorderLayout());
this.add(splitPane);
}
private void createSentencesText()
{
alpha_String = "A: Let’s go to the beach." + n + n
+ "B: That’s a great idea." + n
+ "A: We haven’t been in a while." + n + n
+ "B: We haven’t been in a month." + n
+ "A: The last time we went, you almost drowned." + n
+ "B: No, I didn’t." + n + n + n
+ "A: Then why did the lifeguard dive into the water?" + n
+ "B: I think he wanted to cool off." + n
+ "A: He swam right up to you." + n
+ "B: And then he turned right around." + n
+ "A: Maybe you’re right." + n
+ "B: Maybe we should get going.";
beta_String = "A: Let’s go to the beach." + s + s
+ "B: That’s a great idea." + s
+ "A: We haven’t been in a while." + s + s
+ "B: We haven’t been in a month." + s
+ "A: The last time we went, you almost drowned." + s
+ "B: No, I didn’t." + s + s + s
+ "A: Then why did the lifeguard dive into the water?" + s
+ "B: I think he wanted to cool off." + s
+ "A: He swam right up to you." + s
+ "B: And then he turned right around." + s
+ "A: Maybe you’re right." + s
+ "B: Maybe we should get going.";
}
public static String removeExtraNewLines(String s)
{
String myNewString = s.trim();
StringBuilder stringB = new StringBuilder();
char previouseChar = '~';
for (int i = 0; i < myNewString.length(); i++)
{
if (i > 1)
{
previouseChar = myNewString.charAt(i - 1);
}
if ((myNewString.charAt(i) == '\n') && (previouseChar == '\n'))
{
continue;
}
stringB.append(myNewString.charAt(i));
}
myNewString = stringB.toString();
return myNewString;
}
AbstractAction eventWatcher = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent ae)
{
Object source = ae.getSource();
if (source == buttonAlpha)
{
String arranged_string_alpha = removeExtraNewLines(alpha_String);
textArea.setText(arranged_string_alpha);
}
if (source == buttonBeta)
{
String arranged_string_beta = removeExtraNewLines(beta_String);
textArea.setText(arranged_string_beta);
}
}
};
private static void createAndShowGUI()
{
JFrame frame = new JFrame("NewLine Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(700, 300);
frame.add(new NewLineTest(), BorderLayout.CENTER);
frame.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
UIManager.put("swing.boldMetal", Boolean.FALSE);
createAndShowGUI();
}
});
}
}
Also die Frage: Warum die Prüfung für "\n"
nicht mit neuen Linien Hinzugefügt, mit System.getProperty("line.separator")
?, Und Wie passen Sie?
- Haben Sie sichergestellt, dass auf Ihrem system das System konstant ist in der Tat gleich zu
'\n'
? Es sollte nicht mehr als ein einfacher Vergleich, um zu entdecken, richtig? - Zuerst von allen, welche Betriebssysteme Sie verwenden, um dies zu testen? Zweitens, besitzt
if (string.charAt(i) == System.getProperty("line.separator"))
nicht so funktionieren wie Sie es erwarten? Drittens, haben Sie versucht, mit einem debugger zu untersuchen, was der Wert vonSystem.getProperty("line.separator")
eigentlich ist? - Dieser Artikel kann Sie interessieren en.wikipedia.org/wiki/Newline
- Sie öffnete ein Kopfgeld, aber ohne zu erklären, warum die meisten von Ihnen positiv bewertet werden Antwort Ihre Frage nicht beantwortet.
\n
ist Plattform-abhängig,System.getProperty("line.separator")
könnte\n
oder\r\n
. - Jon Skeet, sagte "Es ist nicht wirklich klar, was Sie versuchen zu überprüfen, in alle", So dass ich aktualisiert meine Frage mit SSCCE, ich dachte, die Antwort wäre anders, wenn die Frage sich wesentlich übersichtlicher. Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, letzteres ist Plattform-spezifische. Es ist die Plattform-unabhängige Weg, um Ihre Plattform line separator.
Also auf Windows, würde ich erwarten, dass
System.getProperty("line.separator")
zurück zu kehren "\r\n", zum Beispiel.Nun als für das, was Ihr
textArea
verwendet für ein neue-Zeile - das hängt ganz von dem, wastextArea
ist - und Sie haben nicht uns irgendwelche Informationen über die.if((string.charAt(i) == '\r')&&((string.charAt(i++) == '\n'))
"\n"
mit ->if(string.charAt(i) == '\n') {// do something}
; die nicht mit Zeilenumbrüche HinzugefügtSystem.getProperty("line.separator")
. Das bedeutet, dass für die gleichen JTextArea und der gleichen Bedingungif(string.charAt(i) == '\n')
; Bei der Fütterung der JTextArea mit neuen Linien mitappend("\n")
Sie werden ergänzt durch die Suchbedingung, aber wenn ichappend(System.getProperty("line.separator"))
die der Suchbedingung entsprechen nicht dieser neuen Linien. Ich will nur vermeiden, mitSystem.getProperty("line.separator")
im Ort"\n"
Danke für die Hilfe.contains
statt... wenn man immer\n
Sie gehen davon aus, dass die Leitung getrennt immer enthält\n
.\n
Zeichen, was natürlich nicht der Fall sein wird, wenn Sie mitline.separator
und der line separator ist\r\n
, wie unter Windows.