20210302のJavaに関する記事は3件です。

プログラミング初心者が基礎基本を地道に身に着ける日記(Java_ABC192編)

※本稿はAtCoderProblemsのBeginnerContest,A~C問題をJavaを用いて地道に解いていく人間の観察日記です

目次

  • まえがき
  • AtCoder Beginner Contest 192に挑戦
    • A問題
    • B問題
    • C問題
  • 感想
  • お世話になったサイト(参考に使用)

まえがき

 前回の記事
~前回のあらすじ~
 昨日はScannerを覚えていなかったことで多くの時間を溶かしたe2vee。しかし、Scannerを覚えてほぼ(?)無敵となった。今日は一味違うぞe2vee!頑張れe2vee~~~!!

AtCoder Begginer Contest 192に挑戦

A問題

192A.java
import java.util.*;

class Main{

  public static void main(String args[]){

    Scanner sc = new Scanner(System.in);

    //入力された整数
    int N = sc.nextInt();

    //100で割って余りを求めるだけ!
    int ans = N % 100;

    //出力(「残り何枚か」だから"100-ans"!)
    System.out.println(100-ans);
  }
}

 オイオイオイなめては困りますよい。流石のJavaNOOBでもこれは解けますよい。Scannerを覚えた自分に死角はないぜ!

B問題

192B.java
import java.util.*;

class Main{

  public static void main(String args[]){

    Scanner sc = new Scanner(System.in);

    //入力された文字列
    String S = sc.next();
    //文字列の長さ
    int length = S.length();
    //読みにくい文字列かどうか
    String ans = "Yes";

    //ここから判定
    //奇数と偶数が逆になっていることに気を付ける!
    for(int n=0; n<S.length(); n++){
      int J = n % 2;

      //読みにくいかどうか判定
      if(J == 0 && Character.isUpperCase(S.charAt(n)) != false){
        ans = "No";
        break;
      }else if(J == 1 && Character.isUpperCase(S.charAt(n)) != true){
        ans = "No";
        break;
      }
    }

    //出力
    System.out.println(ans);
  }
}

 (;・∀・)...............

 テンパりながら検索してみたらCharacter.isUpperCase()でしたね..。すっかり忘れてました。

 ちなみに、これは大文字なら"true"、小文字なら"false"を返してくれます。小文字で"true"が欲しいならUpperLowerに変更でokです。

 ※これはエラーが出るまで気が付かなかったのですが、文字列をScannerで読み取るとき、当初String S = sc.next()nextString()にしていたんですよ..。戒めとしてメモしておきます..。

C問題

192C.java
import java.util.*;

class Main{

  //f(x)=g_1(x)-g_2(x)の実装、戻り値の作成
  public static int f(int x){
    //toChartArray()メソッドを使う
    //String型の文字列⇒char配列に変換する
    //入力されたN(ここではx)をString型にしてからスタート
    char[] a = Integer.toString(x).toCharArray();

    //ここでソート(昇順)
    Arrays.sort(a);

    //StringBuilderクラスを使う
    //文字列の結合・挿入・部分置換・部分削除・文字列検索が可能
    StringBuilder sb = new StringBuilder(new String(a));

    //g_1, g_2を求める!(文字を結合させてint型の数字にする)
    //g_1は降順なので、g_2に代入後、sb.reverse()を行う
    //String型なのでint型に直すのも忘れずに
    int g_2 = Integer.parseInt(sb.toString());
    int g_1 = Integer.parseInt(sb.reverse().toString());

    //f(x)=g_1(x)-g_2(x)を返してあげる
    return g_1 - g_2;

  }

  //メイン(入力を読み取り、f(x)の値を呼び出し、出力する)
  public static void main(String args[]){
    Scanner sc = new Scanner(System.in);
    //入力された数字
    int N = sc.nextInt();//a_0
    int K = sc.nextInt();//a_kまで考える

    //もとめるf(x)の値=ans
    int ans = N; //K=0のときの解
    for(int i=0; i<K; i++){ //K回ループすること(0<Kのとき)
      ans = f(ans); //a_i+1 = f(a_i)という構造
    }

    //答えを出力!
    System.out.println(ans);
  }
}

 チーン⊂´⌒つ* -ω-)っ

 かなりの時間を使ってしまいました。やりたいことがはっきりしているので、草案は早い段階で出来たのですが、せっかくなので、クラス内でメソッドを分けて中級プログラマーの階段を登ろうと頑張った自分を褒めてあげたい!偉い!

 toCharArray()を用いて、得られた数字を配列に格納し、Arrays.sort()で昇順に並べ替え。StringBuilder()で結合や降順に編集を行うという順序をしっかりと理解し、書くまでにかなりの時間を要してしまいました。反省..。

 みんなの解答も見れるみたいなのでサッと見てみたのですが、自分よりも50ms以上効率よく書いてる方もいて、伸びしろの塊だと思って今日も寝ます..。

感想

 最後以外は30分経たずにスッと解けましたが、最後の問題が..。やはり"慣れ"が大事なプログラミング、着実に慣れていきたいですね。

 void(メソッドの戻り値がない)メソッドや、static(インスタンスを生成しないで使える / クラス変数を使うため、戻り値を使うとき便利)メソッドの定義も振り返れてよかったです。

 なんだかんだC問題が解けると、嬉しいorホッとするのが良かったり?また次も頑張ります。

お世話になったサイト

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaでtiff,tifファイルをpngに変換する方法

はじめに

意外とはっきり書いてあるサイトが見つからなかったのでまとめた。
Java9でないと動かないので注意。おそらく9以降なら動くと思うが試していない。
※Java8未満はデフォルトでtiffを読み込めないので、別のライブラリを使用することになる。

ライブラリのインストール

gradleで行った。※一部抜粋

build.gradle
・・・
dependencies {
    compile group: 'javax.media', name: 'jai_core', version: '1.1.3'
}
・・・

実装

ConvertUtil.java
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class ConvertUtil{
    public static void tiffToPng() throws Exception {

        String inputFile = "input.tiff";
        String outputFlie = "output.png";

        try {
            BufferedImage image = ImageIO.read(new File(from));
            BufferedImage tmp = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
            Graphics2D off = tmp.createGraphics();
            off.drawImage(image, 0, 0, Color.WHITE, null);
            ImageIO.write(tmp, "png",  new File(to));
        } catch (Exception e) {
            throw e;
        }
    }
}

最後に

こちらを参考にさせて頂きました。
https://treewoods.net/kugelblitz/?p=1031

Java8以下で実装する場合はJava Advanced Imaging APIというのを使えばよさそう。
ただ単純にライブラリを入れるだけじゃ動かなかったので、もしやることがあれば追記します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java・Dart】Java慣れしてしまった人のためのコード比較(Dart編)

Dartに興味を示すようになってからコードを書いたりして勉強しているが、Java慣れをしまっている影響なのか、気づいたらソースに「boolean」の記述を入れてしまったりしている事があるため、忘れないためにもメモを残しておく。

現段階(2020/03/02)で記載している内容は以下の通り。
※当記事は随時更新していく。

  • private変数
  • Byte・Short・Int・Long型
  • Float・Double型
  • Boolean型
  • Setter・Getterメソッド

private変数

  • Java:型の前に「private」を付ける。
  • Dart:変数名の先頭に「アンダーバー(_)」を付ける。
# Java
private String str = "Hello";

# Dart
String _str = "Hello";

Byte・Short・Int・Long型

Dartでは「int」型のみの扱いだが「64bit」までの整数を扱う事ができるため、Javaの「long」型相当の整数が扱える。

# Java
byte b = 123;
short s = 1234;
int i = 12345;
long l = 12345678901L;

# Dart
int i = 12345678901;

Float・Double型

Dartは「float」型の扱いが無いため、小数点を扱う場合は「double」型を使用する。

# Java
float f = 1.23f;
double d = 1.23;

# Dart
double d = 1.23;

Boolean型

Dartは「boolean」では無く「bool」型で扱う。

# Java
boolean flg = true;

# Dart
bool flg = true;

Setter・Getterメソッド

private変数などの記述の仕方が違うが、DartはJava同等の記述は可能。

# Java
private int id;
private String namek

public int getId() {
  return id;
}

public void setId(int id) {
  this.id = id;
}

public String getName() {
  return id;
}

public void setName(String name) {
  this.name = name;
}

# Dart
int _id;
String _name;

get getId => this._Id;
set setId(id) {
  this._id = id;
}

get getName => this._name;
set setName(name) {
  this._name = name;
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む