【Java】Javaは、全角数字も数字として判断できると知りました。
以前に書いた記事にコメントがついており(名無しの方)、
親切にもコードが書いてありました。(ありがとうございます!)
その中に知らないメソッドがあり、そのメソッドが便利だと思いましたので、
自分のメモ的・勉強を兼ねてエントリー。
<便利だと思ったメソッド>
・lastIndexOf
引数によって、多少意味合いが異なってきますが、指定した文字列が一番右に
出現する位置のインデックスを返す。(intで返す。)
今回はその返り値を利用して、substringで必要な数字を引き出しています。
※+1しないと、,(カンマ)も含まれてしまう為に+1している。
<コメント欄に書かれていたコードを引用してちょっと変更したコード>
上記コードを実行すると、自分的に ちょっと凄いことが発生しました。
全角の10が、ちゃんと10として認識しています。
で、文字か数字か判定するメソッドがあるので、確認してみる。
※isDigitメソッドを使うと、数字ならtrueを 数字以外ならfalseを返す。
で、「true」が返ってくると。。。
Javaの新たな一面を発見・・・。
親切にもコードが書いてありました。(ありがとうございます!)
その中に知らないメソッドがあり、そのメソッドが便利だと思いましたので、
自分のメモ的・勉強を兼ねてエントリー。
<便利だと思ったメソッド>
・lastIndexOf
引数によって、多少意味合いが異なってきますが、指定した文字列が一番右に
出現する位置のインデックスを返す。(intで返す。)
今回はその返り値を利用して、substringで必要な数字を引き出しています。
※+1しないと、,(カンマ)も含まれてしまう為に+1している。
<コメント欄に書かれていたコードを引用してちょっと変更したコード>
import java.util.*;
public class Sort implements Comparator{
public static void main(String[] args) {
Sort sort = new Sort();
sort.execution();
}
public void execution() {
ArrayList<String> data = new ArrayList<String>();
data.add("あいう,24,10");
data.add("test,8,7");
data.add("機械,20,9");
data.add("スーパー,14,11");
data.add("レスキュー,5,21");
Collections.sort(data, this);
for (String element : data) {
System.out.println(element);
}
}
public int compare(String o1, String o2) {
Integer key1 = new Integer(o1.substring(o1.lastIndexOf(',') + 1));
Integer key2 = new Integer(o2.substring(o2.lastIndexOf(',') + 1));
return key2.compareTo(key1);
}
}
上記コードを実行すると、自分的に ちょっと凄いことが発生しました。
全角の10が、ちゃんと10として認識しています。
で、文字か数字か判定するメソッドがあるので、確認してみる。
※isDigitメソッドを使うと、数字ならtrueを 数字以外ならfalseを返す。
class Test{
public static void main(String [] args){
char c = '7';
System.out.println(Character.isDigit(c));
}
}
で、「true」が返ってくると。。。
Javaの新たな一面を発見・・・。
スポンサーサイト
【Java】ディレクトリ配下のファイルを処理する
ディレクトリ配下に複数の拡張子を持つファイルがあり、
特定の拡張子を持つファイルのみ処理しなければならない時に
こんな感じのコードを書きました。
特定の拡張子を持つファイルのみ処理しなければならない時に
こんな感じのコードを書きました。
import java.io.*;
class Test{
public static void main(String [] args){
File directory = new File("TESTS"); // 読み込むディレクトリ
File [] dir = directory.listFiles();
for(File f : dir){
if(f.isFile()){ // ファイルか判定
if(f.toString().endsWith(".txt")) // 拡張子がtxtのファイルのみを扱う
// ここに処理を記述
System.out.println(f);
}else{
// ファイルじゃなければの処理。
// 複数ディレクトリがあり、そのディレクトリも処理しなくてはいけない時は、
// この記述方法では、キツイと思います。
}
}
}
}
【Java】『Dangling meta character』と『Unclosed group』と『Unmatched closing』エラー
必要ワードのみを抜き出したくて、
以下のような感じのコードを書きました。
で、実行したところ
以下のようなExceptionが発生し、うまく動きませんでした。
『Dangling meta character '+'』と言っているんですが、
要はメタキャラクタ使ってるよって言っている感じなので、
バックスラッシュを以下のように入れて回避しました。
そうすると、次に以下のようなエラーが出力されました。
『Unclosed group』って何???みたいな感じでしたが、
冷静になって直訳してみると『開いているグループ』となる為、
"(" ← こいつがいけないんだと思い、以下を追加
で、さらに以下のエラーが出力されました。
『Unmatched closing ')'』とでているので、これもダメと。。。
なので、以下を挿入。
※これは、英語がわからなくても何となくわかるエラーですね。。。
上記を追加して、やっと以下の結果が出力しました。
<迷走した部分>
『Unclosed group』と出力されたExceptionの意味が、なかなか理解できずに小一時間。。。
^の記述されている部分が")"の部分に近かったので、こいつが悪いのかとか、
色々騙され続けて(勝手に騙されていた訳なんですが。。。)迷走していました。
<最終的なコード>
以下のような感じのコードを書きました。
import java.util.*;
import java.util.regex.*;
class WordJudge{
public static void main(String [] args){
WordJudge wj = new WordJudge();
wj.judge();
}
void judge(){
ArrayList<String> al = new ArrayList<String>();
al.add("konc");
al.add("+あいう");
al.add("(´・ω・`)");
al.add("tomo");
al.add("ad)");
al.add("*adf");
al.add("ike");
String s1 = "+あいう";
String s2 = "(´・ω・`)";
Matcher m1;
Matcher m2;
Pattern p1 = Pattern.compile(s1);
Pattern p2 = Pattern.compile(s2);
for(String s : al){
m1 = p1.matcher(s);
m2 = p2.matcher(s);
if(m1.matches()){
System.out.println(s);
}else if(m2.matches()){
System.out.println(s);
}else{
}
}
}
}
で、実行したところ
以下のようなExceptionが発生し、うまく動きませんでした。
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0
+あいう
^
at java.util.regex.Pattern.error(Pattern.java:1650)
at java.util.regex.Pattern.sequence(Pattern.java:1787)
at java.util.regex.Pattern.expr(Pattern.java:1687)
at java.util.regex.Pattern.compile(Pattern.java:1397)
at java.util.regex.Pattern.<init>(Pattern.java:1124)
at java.util.regex.Pattern.compile(Pattern.java:817)
at WordJudge.judge(WordJudge.java:25)
at WordJudge.main(WordJudge.java:7)
『Dangling meta character '+'』と言っているんですが、
要はメタキャラクタ使ってるよって言っている感じなので、
バックスラッシュを以下のように入れて回避しました。
if(s1.indexOf("+") != -1){
s1 = s1.replaceAll("\\+","\\\\+");
}
そうすると、次に以下のようなエラーが出力されました。
Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 5
(ad\)
^
at java.util.regex.Pattern.error(Pattern.java:1650)
at java.util.regex.Pattern.accept(Pattern.java:1508)
at java.util.regex.Pattern.group0(Pattern.java:2460)
at java.util.regex.Pattern.sequence(Pattern.java:1715)
at java.util.regex.Pattern.expr(Pattern.java:1687)
at java.util.regex.Pattern.compile(Pattern.java:1397)
at java.util.regex.Pattern.<init>(Pattern.java:1124)
at java.util.regex.Pattern.compile(Pattern.java:817)
at WordJudge.judge(WordJudge.java:167)
at WordJudge.main(WordJudge.java:140)
『Unclosed group』って何???みたいな感じでしたが、
冷静になって直訳してみると『開いているグループ』となる為、
"(" ← こいつがいけないんだと思い、以下を追加
if(s2.indexOf("(") != -1){
s2 = s2.replaceAll("\\(","\\\\(");
}
で、さらに以下のエラーが出力されました。
Exception in thread "main" java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 1
ad)
^
at java.util.regex.Pattern.error(Pattern.java:1650)
at java.util.regex.Pattern.compile(Pattern.java:1401)
at java.util.regex.Pattern.<init>(Pattern.java:1124)
at java.util.regex.Pattern.compile(Pattern.java:817)
at WordJudge.judge(WordJudge.java:170)
at WordJudge.main(WordJudge.java:140)
『Unmatched closing ')'』とでているので、これもダメと。。。
なので、以下を挿入。
※これは、英語がわからなくても何となくわかるエラーですね。。。
if(s2.indexOf(")") != -1){
s2 = s2.replaceAll("\\)","\\\\)");
}
上記を追加して、やっと以下の結果が出力しました。
+あいう
(ad)
<迷走した部分>
『Unclosed group』と出力されたExceptionの意味が、なかなか理解できずに小一時間。。。
^の記述されている部分が")"の部分に近かったので、こいつが悪いのかとか、
色々騙され続けて(勝手に騙されていた訳なんですが。。。)迷走していました。
<最終的なコード>
import java.util.*;
import java.util.regex.*;
class WordJudge{
public static void main(String [] args){
WordJudge wj = new WordJudge();
wj.judge();
}
void judge(){
ArrayList<String> al = new ArrayList<String>();
al.add("konc");
al.add("+あいう");
al.add("(´・ω・`)");
al.add("tomo");
al.add("(ad)");
al.add("*adf");
al.add("ike");
String s1 = "+あいう";
String s2 = "(ad)";
if(s1.indexOf("+") != -1){
s1 = s1.replaceAll("\\+","\\\\+");
}
if(s2.indexOf("(") != -1){
s2 = s2.replaceAll("\\(","\\\\(");
}
if(s2.indexOf(")") != -1){
s2 = s2.replaceAll("\\)","\\\\)");
}
Matcher m1;
Matcher m2;
Pattern p1 = Pattern.compile(s1);
Pattern p2 = Pattern.compile(s2);
for(String s : al){
m1 = p1.matcher(s);
m2 = p2.matcher(s);
if(m1.matches()){
System.out.println(s);
}else if(m2.matches()){
System.out.println(s);
}
}
}
}
【Java】HashMapのvalueで、sortしたかった
ハッシュの値でソートしたかった時がありまして、
その際に、以下のようなコードを記述しました。
※キーでソートではないです。
<概要>
key = ユニークな値
value = 重複する数字
読み込むデータが複数のカンマ区切りのデータで、最後のカンマ以降の値が数値となっている。
最後のカンマまでの値は、ユニークなキーになる。
<何がしたかったか>
カンマ区切りのデータを値と数値に分けて、数値を降順でソートして、同じ形式で出力する。
<迷走した部分>
TreeMAPで簡単にsortできると思っていたら、調べた限りできなくて迷走。。。
Webの素晴らしきログから、以下の方法が導きだせたので、同じようなところで
悩まれた方の手助けになればと。。。(プログラム素人なので、信頼性はありませんが。。。)
で、導きだしたのは、Comparatorを実装して、値を比較しreturnすることにより解消。
でも結局は、ハッシュでソートではなくて、配列とコレクションでのソートなので、
タイトルは若干の誤りがあるような、ないような。。。
<コード>
上記コード作成中にコンパイルした際に、以下のようなメッセージが出力されました。
そこで上記で言われた通りに『-Xlint:unchecked』指定で、再コンパイルしてみると
以下のメッセージが出力されました。
で、これは配列とかをgenericsしていなかったから『未チェック』と注意されていたわけです。
上記部分は、Comparatorについての警告メッセージですが要は、以下のように該当する部分を
限定してあげることで、出力されなくなりました。
その際に、以下のようなコードを記述しました。
※キーでソートではないです。
<概要>
key = ユニークな値
value = 重複する数字
読み込むデータが複数のカンマ区切りのデータで、最後のカンマ以降の値が数値となっている。
最後のカンマまでの値は、ユニークなキーになる。
<何がしたかったか>
カンマ区切りのデータを値と数値に分けて、数値を降順でソートして、同じ形式で出力する。
<迷走した部分>
TreeMAPで簡単にsortできると思っていたら、調べた限りできなくて迷走。。。
Webの素晴らしきログから、以下の方法が導きだせたので、同じようなところで
悩まれた方の手助けになればと。。。(プログラム素人なので、信頼性はありませんが。。。)
で、導きだしたのは、Comparatorを実装して、値を比較しreturnすることにより解消。
でも結局は、ハッシュでソートではなくて、配列とコレクションでのソートなので、
タイトルは若干の誤りがあるような、ないような。。。
<コード>
import java.util.*;
import java.util.regex.*;
class Sort{
public static void main(String [] args){
Sort sort = new Sort();
sort.execution();
}
void execution(){
ArrayList<String> data = new ArrayList<String>();
data.add("あいう,24,5");
data.add("test,8");
data.add("機械,20");
data.add("スーパー,14");
data.add("レスキュー,5,21");
Matcher m;
Pattern p = Pattern.compile("^(.*),(\\d+)$");
HashMap<String,Integer> hm = new HashMap<String,Integer>();
for(String s : data){
m = p.matcher(s);
if(m.matches()){
hm.put(m.group(1),Integer.parseInt(m.group(2)));
}
}
ArrayList<Map.Entry> array = new ArrayList<Map.Entry>(hm.entrySet());
Collections.sort(array,new Comparator<Object>(){
public int compare(Object o1, Object o2){
Map.Entry e1 =(Map.Entry)o1;
Map.Entry e2 =(Map.Entry)o2;
Integer e1Value = (Integer) e1.getValue();
Integer e2Value = (Integer) e2.getValue();
return (e2Value.compareTo(e1Value));
}
});
Iterator it = array.iterator();
while(it.hasNext()) {
Map.Entry obj = (Map.Entry)it.next();
System.out.println(obj.getKey() + "," + obj.getValue());
}
}
}
上記コード作成中にコンパイルした際に、以下のようなメッセージが出力されました。
注:Sort.java の操作は、未チェックまたは安全ではありません。
注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。
そこで上記で言われた通りに『-Xlint:unchecked』指定で、再コンパイルしてみると
以下のメッセージが出力されました。
デスクトップ>javac -Xlint:unchecked Sort.java
Sort.java:33: 警告:[unchecked] 無検査変換です
検出値 : <anonymous java.util.Comparator>
期待値 : java.util.Comparator<? super java.util.Map.Entry>
Collections.sort(array,new Comparator(){
^
Sort.java:33: 警告:[unchecked] 無検査メソッド呼び出し: java.util.Collections
の <T>sort(java.util.List<T>,java.util.Comparator<? super T>) は (java.util
.ArrayList<java.util.Map.Entry>,<anonymous java.util.Comparator>) に適用されます。
Collections.sort(array,new Comparator(){
^
警告 2 個
デスクトップ>
で、これは配列とかをgenericsしていなかったから『未チェック』と注意されていたわけです。
上記部分は、Comparatorについての警告メッセージですが要は、以下のように該当する部分を
限定してあげることで、出力されなくなりました。
ArrayList array = new ArrayList(hm.entrySet());
↓
ArrayList <Map.Entry> array = new ArrayList<Map.Entry>(hm.entrySet());
【Java】ログに含まれている特定の文字列の行だけを出力
ログに特定の文字列が含まれていて、
その特定の文字列の行を抽出しなければいけない際にこんな感じのを書きました。
今回は、『大会』という文字列を含む行を抜粋しなければいけないと仮定。
<読み込むデータ>
<コード>
<結果>
その特定の文字列の行を抽出しなければいけない際にこんな感じのを書きました。
今回は、『大会』という文字列を含む行を抜粋しなければいけないと仮定。
<読み込むデータ>
そういえば
一月にあった
とうもろこし大会の
相談をしたいねー
大会は、
とめどなく
そうだねー
だから大会
desuyone!
<コード>
import java.io.*;
class Unyou{
public static void main(String [] args){
BufferedReader br = null;
String fileName = "test.txt";
try{
br = new BufferedReader(new FileReader(fileName));
String line;
while((line = br.readLine()) != null){
if(line.indexOf("大会") != -1)
System.out.println(line);
}
br.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
}
<結果>
とうもろこし大会の
大会は、
だから大会